如何在从另一个线程更新某些控件时确保线程安全?有人可以帮忙吗?
答案 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