2012-01-20 72 views
1

我想讓主線程產生線程並且能夠繼續產生更多的輸出,等待所有線程完成。線程的產生是用戶控制的,所以用戶可以在不同的時間段添加更多的線程。主線程在finalize c中等待線程#

事情是...當主線程正在運行finalize時,我該如何做到這一點。在完成之前讓它等到所有活動線程完成。

+1

是否正確使用.join()方法? – Ismael

+2

您的問題中缺少一些東西:您說用戶可以在不同的時間段添加線程。我的問題是:主線程在等待用戶時會做什麼?主線程如何知道用戶沒有更多的線程要添加? –

回答

2

記錄所有創建的線程;例如,通過List<Thread>集合。當您在finalize方法是,只是遍歷所有的線程並調用它們Join方法順序,如下面的WaitForThreads方法:

private readonly List<Thread> threads = new List<Thread>(); 

public void SpawnThread(Action action) 
{ 
    Thread thread = new Thread(new ThreadStart(action)); 
    thread.IsBackground = false; 
    threads.Add(thread); 
    thread.Start(); 
} 

private void WaitForThreads() 
{ 
    foreach (Thread thread in threads) 
     thread.Join(); 
} 

Thread.Join阻塞調用線程(這應該是你的主線程)直到特定線程終止。如果線程已經被終止,那麼這個調用會立即返回(這就是爲什麼你不需要在終止時從集合中刪除線程的原因,儘管你仍然應該爲了垃圾收集)。

另外,您應該考慮爲什麼您需要等待線程在finalize方法中終止。如果僅僅是爲了防止它們在主線程終止時被強行中止,那麼就沒有必要;您的進程將保持活動狀態(即使沒有窗口),直到IsBackground屬性爲false的所有線程完成執行。垃圾收集同樣如此;你的堆對象不會被終結,直到它們不再被任何活線程引用,而不僅僅是主線程。

+0

我真的不需要Thread.Join,因爲我不需要線程的任何回報。我需要的是讓主線程準備好接收越來越多的線程,而產生的線程完成工作。 這是非常有趣的代碼,我工作得很好。我錯過的是IsBackground = false;線。我有這個真實的,所以當主線程終止產生的線程隨之而來。 – user1161221

+0

在這種情況下使用術語「背景」是有誤導性的。開發人員最初認爲所有線程都是後臺線程,除了主線程之外,這是很常見的。很高興有幫助! – Douglas