如何在从另一个线程更新某些控件时确保线程安全?

时间:2010-09-14 09:38:15

标签: c#

如何在从另一个线程更新某些控件时确保线程安全?有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

在WPF中(有关WinForms的详细信息,请参阅注释):您需要调用调度程序在UI线程上执行代码:See MSDN here

如果你不这样做,你将很快遇到异常,因为运行时不允许你从没有创建它的线程更新UI组件。

BeginInvoke优于Invoke,因为前者是异步的 - 您不需要等待UI线程被唤醒,并且在调用线程可以继续之前调用委托 - 请参阅此StackOverflow question

例如:

public delegate void myUIDelegate();

myButton.Dispatcher.BeginInvoke(
    DispatcherPriority.Normal,
    new myUIDelegate(() => {
       // Any code in this anonymous delegate is UI thread safe
       myButton.Enabled = true;
    }));

这将在.Net 3.5及更高版本中工作,下面你必须更明确地使用匿名委托或者只是定义一个命名方法:

public delegate void myUIDelegate();

myButton.Dispatcher.BeginInvoke(
    DispatcherPriority.Normal,
    new myUIDelegate(EnableButton));

...

private void EnableButton() {
   myButton.Enabled = true;
}

答案 1 :(得分:1)

对于winforms

您需要使用Control.InvokeRequired属性

见下文artical

http://www.codeproject.com/KB/cs/AvoidingInvokeRequired.aspx