2008-08-05 53 views

回答

3

如果數據修改不是太耗時(即,如果後臺線程的主要目的不是實際的數據修改),請嘗試將修改數據的部分移動到委託並調用該委託。

如果實際繁重的工作在數據上,您可能需要創建此數據的深層副本以傳遞給後臺線程,後臺線程將再次通過Invoke將處理後的數據發送回UI線程。

您將只需要移動將數據更改爲委託函數的代碼(因爲數據更改是觸發控件更新的原因)。除此之外,你不應該寫任何額外的東西。

3

你應該能夠做這樣的事情:

if (control.InvokeRequired) 
{ 
    control.Invoke(delegateWithMyCode); 
} 
else 
{ 
    delegateWithMyCode(); 
} 

InvokeRequired是控制屬性,看看你是否在正確的線程,然後調用將調用在正確的線程的委託。

UPDATE:其實,在我上一份工作,我們做了這樣的事情:

private void SomeEventHandler(Object someParam) 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam); 
    } 

    // Regular handling code 
} 

這消除了對其他模塊的需要,那種收緊的代碼。

1

因爲我沒有測試用例,所以我不能保證這個解決方案,但在我看來,類似於用於更新不同線程中的進度條的場景(使用委託)將會適合在這裏。

public delegate void DataBindDelegate(); 
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind); 

public void DoDataBind() 
{ 
    DataBind(); 
} 

如果數據綁定需要由特定線程完成,那麼讓該線程完成工作!

0

如果線程調用是「非法」的(即DataBind調用會影響在線程中沒有創建的控件,那麼它將被調用),那麼您需要創建一個委託,以便即使DataBind的決策/準備不是在控制創建線程中完成的,它們的任何結果修改(即DataBind())將會是。

你會調用從輔助線程我的代碼如下所示:

this.BindData.Invoke(); 

這將進而導致原來的線程做綁定,這(假定它是創建控件的線程)應該工作。

0

在WPF和Silverlight中,綁定基礎結構負責切換到UI線程。

相關問題