我在我的.net应用程序中使用DataBindings,并且有些地方,我从辅助线程更新一些UI值。所以,我需要调用主UI线程来执行GUI操作,没有例外。
在.net 3世界中我可以说Dispatcher.CurrentDispatcher.Invoke(()=>{ /* update UI here */} );
但现在我只使用.net 2.0。
在这些地方,我无法访问任何gui Control来做Control.Invoke。 那么,在这种情况下如何安全地更新我的UI?
答案 0 :(得分:3)
在.NET 2.0和Windows窗体中,您必须使用控件的BeginInvoke
/ EndInvoke
方法从后台线程更新UI。
MSDN有following sample:
public delegate void InvokeDelegate();
private void Invoke_Click(object sender, EventArgs e)
{
myTextBox.BeginInvoke(new InvokeDelegate(InvokeMethod));
}
public void InvokeMethod()
{
myTextBox.Text = "Executed the given delegate";
}
答案 1 :(得分:3)
这是完全相同的答案。获取ui控件的实例引用(因为它们始终在主线程上运行),检查它是否仍然存在,并让它调用您想要在主线程上运行的代码。愚蠢的.NET 2.0,但有效。如果您的代码在表单中,您甚至可以使用:
BeginInvoke((ThreadStart)delegate{your.code.here();even.more.code.here();});
答案 2 :(得分:2)
也许Application.OpenForms[0].Invoke
?
答案 3 :(得分:0)
答案 4 :(得分:0)
当我有这种需要时,我总是创建一个以
开头的方法If (control.InvokeRequired)
{
control.Invoke([This method], params);
return;
}
然后执行在ui上运行所需的内容,这样你就可以调用这个方法,它将在UI线程上运行..