Dispatcher.Invoke类似于.net 2.0

时间:2010-12-02 08:53:08

标签: c# multithreading data-binding

我在我的.net应用程序中使用DataBindings,并且有些地方,我从辅助线程更新一些UI值。所以,我需要调用主UI线程来执行GUI操作,没有例外。

在.net 3世界中我可以说Dispatcher.CurrentDispatcher.Invoke(()=>{ /* update UI here */} );但现在我只使用.net 2.0。

在这些地方,我无法访问任何gui Control来做Control.Invoke。 那么,在这种情况下如何安全地更新我的UI?

5 个答案:

答案 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)

您应该选择一种可以帮助您做同样的设计模式。

应该可以使用可以访问表单(或其对象)的类将操作委派给表单。这个类可能被线程使用(确保它全部同步)。

编辑:

This也可能对您感兴趣!

答案 4 :(得分:0)

当我有这种需要时,我总是创建一个以

开头的方法
If (control.InvokeRequired)
{
    control.Invoke([This method], params);
    return;
}

然后执行在ui上运行所需的内容,这样你就可以调用这个方法,它将在UI线程上运行..