WPF多线程访问控件
2024-10-19 21:28:27
大家知道WPF中多线程访问UI控件时会提示UI线程的数据不能直接被其他线程访问或者修改,该怎样来做呢?
分下面两种情况
1.WinForm程序
1)第一种方法,使用委托:
private delegate void SetTextCallback(string text);
private void SetText(string text)
{
// InvokeRequired需要比较调用线程ID和创建线程ID
// 如果它们不相同则返回true
if (this.txt_Name.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.txt_Name.Text = text;
}
}
2)第二种方法,使用匿名委托
private void SetText(Object obj)
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate
{
this.txt_Name.Text = obj;
}));
}
else
{
this.txt_Name.Text = obj;
}
}
这里说一下BeginInvoke和Invoke和区别:BeginInvoke会立即返回,Invoke会等执行完后再返回。
2.WPF程序
1)可以使用Dispatcher线程模型来修改
如果是窗体本身可使用类似如下的代码:
this.lblState.Dispatcher.Invoke(new Action(delegate
{
this.lblState.Content = "状态:" + this._statusText;
}));
那么假如是在一个公共类中弹出一个窗口、播放声音等呢?这里我们可以使用:System.Windows.Application.Current.Dispatcher,如下所示
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
if (path.EndsWith(".mp3") || path.EndsWith(".wma") || path.EndsWith(".wav"))
{
_player.Open(new Uri(path));
_player.Play();
}
}));
最新文章
- C# List<;T>; 合并、去重、查找
- #import、#include以及@class的区别
- HDU1431+简单题
- Xamarin 安装体验
- scp 对拷文件夹 和 文件夹下的所有文件 对拷文件并重命名
- http keepalive and tcpkeepalive
- Objective-C Json 使用
- 利用Matlab生成一个网格化的三维三轴椭球面(生成直角坐标)
- POJ-3295 Tautology---栈+表达式求值
- DNS的功能-域名空间、域名注册和域名解析
- 【python小练】0005
- C#压缩图片时保留原始的Exif信息
- ubuntu命令行打开网页
- PAT A1120 Friend Numbers (20 分)——set
- tomcat9 性能调优
- Codeforces 488B - Candy Boxes
- Vim 文件配置
- (转)Nuts and Bolts of Applying Deep Learning
- google vue开发调试插件,简便安装,亲测可用
- VB6 写文件