[英]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.