2011-02-09 65 views
2

我在WPF中編寫應用程序。我有一個主線程和另一個主線程 - 我計算了一些東西。在主線程中,我需要在完成附加線程後執行一個操作。我無法使用Join作爲附加線程,因爲我不想阻塞主線程。我如何等待完成第二個線程,同時不要阻塞主線程?WPF中的線程問題

回答

3

最簡單的方法是使用backgroundworker並處理RunWorkerCompleted事件。

我也邀請您參加的 約瑟夫阿爾巴哈利的Threading in C# pdf

+0

嗯,我想這不會是最好的解決辦法。我想取消這個額外的線程,當我點擊取消按鈕。我知道後臺工作者有CancelAsync()方法,但是應該在後臺工作者中完成的方法是獨立運行的。我的意思是在這個函數中我沒有可以打破的循環,但我只是調用一個系統函數來優化,我不能打破它。 – ravenik

+0

@ravenik。不管您選擇哪種解決方案,您是否都有這個問題? 'if(_bw.CancellationPending){e.Cancel = true;返回; }'設置'e.result'足夠給你嗎? –

2

另一種簡單的方法來看看第3部分是使用任務並行庫和鏈中的多個任務,continuations

雖然它不能免除你@康拉德的建議:請閱讀the threading book。這很吸引人,而且完全值得努力。

+0

@Anvanka +1延續是一個非常好的選擇 –

0

如果你創建你自己的線程,有工作線程調用回調方法時,它的完成:

public delegate void DoneDelegate (object calculationResults); 
public class MyWorker 
{ 
    public DoneDelegate Done { get; set; } 
    public void Go() 
    { 
     object results = null; 
     // do some work 
     Done(results); 
    } 
} 

public class Main 
{ 
    public void StartWorker() 
    { 
     MyWorker worker = new MyWorker(); 
     worker.Done = new DoneDelegate(DoneCallback); 
     System.Threading.Thread thread = new System.Threading.Thread(worker.Go); 
     thread.IsBackground = true; 
     thread.Start(); 
    } 
    public void DoneCallback (object results) 
    { 
     // use the results 
    } 
}