WPF多线程访问控件

王朝学院·作者佚名  2016-05-16
窄屏简体版  字體: 小  |  中  |  大  |  超大  

WPF多线程访问控件大家知道WPF中多线程访问UI控件时会提示UI线程的数据不能直接被其他线程访问或者修改,该怎样来做呢?

分下面两种情况

1.WinForm程序

1 2 1)第一种方法,使用委托: 3 PRivate delegate void SetTextCallback(string text); 4 private void SetText(string text) 5 { 6 // InvokeRequired需要比较调用线程ID和创建线程ID 7 // 如果它们不相同则返回true 8 if (this.txt_Name.InvokeRequired) 9 {10 SetTextCallback d = new SetTextCallback(SetText);11 this.Invoke(d, new object[] { text });12 }13 else14 {15 this.txt_Name.Text = text;16 }17 }18 2)第二种方法,使用匿名委托19 private void SetText(Object obj)20 {21 if (this.InvokeRequired)22 {23 this.Invoke(new MethodInvoker(delegate24 {25 this.txt_Name.Text = obj;26 }));27 }28 else29 {30 this.txt_Name.Text = obj;31 }32 }33 这里说一下BeginInvoke和Invoke和区别:BeginInvoke会立即返回,Invoke会等执行完后再返回。

View Code2.WPF程序

1)可以使用Dispatcher线程模型来修改

如果是窗体本身可使用类似如下的代码:

this.lblState.Dispatcher.Invoke(new Action(delegate{ this.lblState.Content = "状态:" + this._statusText;}));

View Code

那么假如是在一个公共类中弹出一个窗口、播放声音等呢?这里我们可以使用: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(); } }));

View Code

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航