我想讓主線程產生線程並且能夠繼續產生更多的輸出,等待所有線程完成。線程的產生是用戶控制的,所以用戶可以在不同的時間段添加更多的線程。主線程在finalize c中等待線程#
事情是...當主線程正在運行finalize時,我該如何做到這一點。在完成之前讓它等到所有活動線程完成。
我想讓主線程產生線程並且能夠繼續產生更多的輸出,等待所有線程完成。線程的產生是用戶控制的,所以用戶可以在不同的時間段添加更多的線程。主線程在finalize c中等待線程#
事情是...當主線程正在運行finalize時,我該如何做到這一點。在完成之前讓它等到所有活動線程完成。
記錄所有創建的線程;例如,通過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
的所有線程完成執行。垃圾收集同樣如此;你的堆對象不會被終結,直到它們不再被任何活線程引用,而不僅僅是主線程。
我真的不需要Thread.Join,因爲我不需要線程的任何回報。我需要的是讓主線程準備好接收越來越多的線程,而產生的線程完成工作。 這是非常有趣的代碼,我工作得很好。我錯過的是IsBackground = false;線。我有這個真實的,所以當主線程終止產生的線程隨之而來。 – user1161221
在這種情況下使用術語「背景」是有誤導性的。開發人員最初認爲所有線程都是後臺線程,除了主線程之外,這是很常見的。很高興有幫助! – Douglas
是否正確使用.join()方法? – Ismael
您的問題中缺少一些東西:您說用戶可以在不同的時間段添加線程。我的問題是:主線程在等待用戶時會做什麼?主線程如何知道用戶沒有更多的線程要添加? –