大家知道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();
}
}));

  

最新文章

  1. C# List<T> 合并、去重、查找
  2. #import、#include以及@class的区别
  3. HDU1431+简单题
  4. Xamarin 安装体验
  5. scp 对拷文件夹 和 文件夹下的所有文件 对拷文件并重命名
  6. http keepalive and tcpkeepalive
  7. Objective-C Json 使用
  8. 利用Matlab生成一个网格化的三维三轴椭球面(生成直角坐标)
  9. POJ-3295 Tautology---栈+表达式求值
  10. DNS的功能-域名空间、域名注册和域名解析
  11. 【python小练】0005
  12. C#压缩图片时保留原始的Exif信息
  13. ubuntu命令行打开网页
  14. PAT A1120 Friend Numbers (20 分)——set
  15. tomcat9 性能调优
  16. Codeforces 488B - Candy Boxes
  17. Vim 文件配置
  18. (转)Nuts and Bolts of Applying Deep Learning
  19. google vue开发调试插件,简便安装,亲测可用
  20. VB6 写文件

热门文章

  1. An application icon
  2. Android——SD卡工具类——SDCardUtils.java
  3. wso2esb安装及helloworld
  4. Eclipse常用且不易记快捷键
  5. 华硕M2A-VM+AMD4000超频方法
  6. 前端工程精粹(一):静态资源版本更新与缓存(附精简js的工具)
  7. HDUOJ---1867 A + B for you again
  8. PowerDesigner 12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键
  9. Windows WaveIn 录音
  10. 转multicast vs broadcast