WinformWPF 多线程访问控件

Posted 唐宋元明清的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WinformWPF 多线程访问控件相关的知识,希望对你有一定的参考价值。

大家知道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 多线程访问控件的主要内容,如果未能解决你的问题,请参考以下文章

多线程更新UI的常用方法

多个请求是多线程吗

vb.net 多线程 访问界面控件

C# Winform项目中多线程环境下, 如何跨线程对Window窗体控件进行安全访问?

winform中如何在多线程中更新UI控件--ListView实时显示执行信息

实现Winform 跨线程安全访问UI控件