![](/img/trans.png)
[英]Use ThreadPool in C# within a loop and wait for all threads to finish
[英]Wait for threadpool's threads to finish
我有這種方法:
/// <summary>
/// Waits for all threads in the thread pool to be finished.
/// </summary>
/// <param name="maxWaitingTime">Maximum time to wait in seconds</param>
/// <returns>true if all threads in pool are finished before maxWaitingTime. False if maxWaitingTime is hit </returns>
public bool WaitForThreads(int maxWaitingTime)
{
int maxThreads = 0;
int placeHolder = 0;
int availableThreads = 0;
while (maxWaitingTime > 0)
{
System.Threading.ThreadPool.GetMaxThreads(out maxThreads, out placeHolder);
System.Threading.ThreadPool.GetAvailableThreads(out availableThreads, out placeHolder);
//Stop if all threads are available
if (availableThreads == maxThreads)
{
return true;
}
System.Threading.Thread.Sleep(TimeSpan.FromMilliseconds(1000));
--maxWaitingTime;
}
return false;
}
我在控制台應用程序中使用它來等待一段時間,以便線程池正在處理的所有任務都已完成。 我將最大線程數設置為8,但是以某種方式可用線程永遠不會達到最大線程數,總是有一個線程仍在忙。
我在想,即使直接從program.cs調用此方法,也要在線程池中調用此方法。
我如何在Visual Studio的線程窗口中查看線程池中是否運行了線程?
那不是“ maxThreads”的意思。 線程池調度程序的工作是保持活動線程數等於“ minThreads”。 只有當這些線程沒有在合理的時間內完成(合理的是半秒)時,調度程序才會使另一個線程可用以嘗試減少積壓。 “ maxThreads”值設置了它提供多少個附加線程的上限。
因此,您真正要測試的是檢查可用線程數是否等於或大於“ minThreads”。
這是一個非常糟糕的做法, 很可能您的代碼將陷入僵局。 當代碼意外地與您不知道的Timer或TP線程同步時,會發生這種情況,因為它們是由.NET Framework代碼啟動的。 等待TP線程可靠地完成需要編寫顯式代碼以檢查條件,這些線程在退出時必須向同步對象發出信號,以便可以使用WaitHandle.WaitAll()。 最好使用Task.WaitAll()方法完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.