码迷,mamicode.com
首页 > 编程语言 > 详细

WinformWPF 多线程访问控件【转】

时间:2016-12-09 19:04:58      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:创建线程   object   pat   修改   启用   线程id   lin   new   eth   

大家知道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会等执行完后再返回。

Winform也可以直接设置启用多线程访问属性的设置,委托之类的也就可以不用添加了。

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();
    }
 }));

 

WinformWPF 多线程访问控件【转】

标签:创建线程   object   pat   修改   启用   线程id   lin   new   eth   

原文地址:http://www.cnblogs.com/kybs0/p/6150374.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!