2010-12-02 59 views
2

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

in .net 3 world我可以说Dispatcher.CurrentDispatcher.Invoke(()=>{ /* update UI here */});但现在我只与.net 2.0一起工作。

在这些地方我无法访问任何GUI控件做Control.Invoke。 那么,如何安全地更新我的用户界面呢?

回答

2

也许Application.OpenForms[0].Invoke

+0

谢谢,这是有效的。我只是不确定,那是什么:)是第一个由应用程序创建的窗体吗?如果它已经被处理了呢? – Shaddix 2010-12-02 09:34:47

+0

这些是目前开放的表单。它不一定是主要的形式。因此,如果您在除主UI线程之外的其他线程上创建新窗口,则可能会遇到问题。 – Botz3000 2010-12-02 10:04:43

0

你应该选择一种设计模式来帮助你做同样的事情。

应该使用可以访问窗体(或其对象)的类来将操作委托给窗体。这个类可能被线程使用(确保它们都是同步的)。

编辑:

This你可能会感兴趣呢!

+0

我目前对我的主窗体使用静态引用,所以它看起来像你建议的。它的工作原理,但与调度器它更干净..认为,在.net 2.0中有类似的东西。不幸的是,似乎没有:( – Shaddix 2010-12-02 09:38:49

3

在.NET 2.0和Windows Forms中,您必须使用控件的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"; 
} 
0

当我有需要,我总是创建与

If (control.InvokeRequired) 
{ 
    control.Invoke([This method], params); 
    return; 
} 

启动方法,然后执行什么是需要在UI上运行,这样你可以调用这个方法,它会运行在UI线程上。

3

这些都是一样的答案。取一个ui控件的实例引用(因为它们总是在主线程上运行),检查它是否仍然存在,并让它调用你想要在主线程上运行的代码。愚蠢的.NET 2.0,但工程。如果你的代码是在一个窗体中,你甚至可以使用:

BeginInvoke((ThreadStart)delegate{your.code.here();even.more.code.here();});