2010-12-02 45 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();});