2009-11-18 177 views
3

我有一個用戶控件與樹上。它使用多線程向其添加節點。我有一個函數稱爲展開,我需要執行過濾完成後,因爲我是一個多線程的新手我不知道如何做到這一點。這裏是我的代碼:等待的線程問題

class MyClass : UserControl 
{ 
    private Thread nThread; 
    private bool searchLoadCompleted = false; 

    private void Filter() 
    { 
     ClearTree(); 
     this.nThread = new Thread(new ParameterizedThreadStart(AddFilteredResultsToTree)); 
     this.nThread.IsBackground = true; 
     this.nThread.Start(someParameter); 
    } 

    private void AddFilteredResultsToTree(int someParameter) 
    { 
     myTree.Invoke(new MethodInvoker(()=> this.searchLoadCompleted = false)); 
     myTree.Invoke(new MethodInvoker(()=> AppendNode(......))); 
     myTree.Invoke(new MethodInvoker(()=> this.searchLoadCompleted = true)); 
    } 

    private void Expand() 
    { 
    } 
} 

我嘗試添加nThread.Join()Expand()但它得到無限期地卡住。我該怎麼辦?

+0

爲什麼不把Expand()代碼放到AddFilteredResultsToTree()中? – 2009-11-18 14:12:08

回答

2

如果這樣做的單線程的版本是:

ClearTree(); 
AddFilteredResultsToTree(someparameter); 
Expand(); 

不要去打擾多線程,只是做在同一個線程。在那裏使用多線程的關鍵是讓主線程處理UI事件,如果你加入線程,那麼你基本上只是在主線程中凍結(不做任何工作)的時候啓動後臺線程。請注意,通過調用Invoke,實際上將AddFilteredResultsToTree的執行委託給主線程。

我建議你簡單地調用Expand從AddFilteredResult並使用分派器來更新UI,如果需要或。

另一種走(我認爲最好)的方法是使用Async Pattern(示例和教程here),然後在AsyncCallback上更新UI。

1

調用Invoke將阻止GUI線程和工作線程,所以不會有沒有工作線程的代碼的性能改進。