2010-02-15 70 views
4

好吧,我應該已經知道答案,但...簡單的多線程問題

我想在平行於一個單獨的線程執行不同的任務,等待所有線程的執行繼續之前完成。我知道我可以使用ThreadPool.QueueUserWorkItem()BackgroundWorker但不想使用(無特殊原因)。

那麼下面的代碼是否正確地在後臺線程上並行執行任務並等待它們完成處理?

Thread[] threads = new Thread[3]; 
for (int i = 0; i < threads.Length; i++) 
{ 
    threads[i] = new Thread(SomeActionDelegate); 
    threads[i].Start(); 

} 

for (int i = 0; i < threads.Length; i++) 
{ 
    threads[i].Join(); 
} 

我知道這個問題肯定已經被問了100次,所以感謝您的回答和耐心。

+0

產生新的線程是昂貴的,所以你一般要避免短期運行的任務,這樣做。 – 2010-02-15 11:00:42

+0

@布萊恩我完全同意,感謝提醒 – Kane 2010-02-15 11:09:37

回答

4

是的,這是一個正確的方法來做到這一點。但是,如果SomeActionDelegate相對較小,那麼創建3個線程的開銷將很大。這就是爲什麼你可能應該使用ThreadPool。即使它沒有乾淨的等同於加入。

BackgroundWorker主要用於與GUI進行交互時。

1

總是很難說什麼是「正確」的方式,但是你的方法確實工作正常。

但是,通過使用Join,UI線程(如果主線程是UI線程)將被阻止,因此會凍結UI。如果情況並非如此,即使它有不同的問題(可伸縮性/併發線程數量等),您的方法基本上也可以。