我有这个方法:
/// <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;
}
我在控制台应用程序中使用它等待一段时间,以便完成threadpool正在处理的所有任务。我已经将最大线程设置为8,但不知何故可用线程永远不会到达最大线程,总有一个线程仍然忙。
我在想这个方法在线程池中被调用,即使我直接从program.cs调用这个方法。
如果在线程池中运行线程,我怎样才能在visual studio的线程窗口中看到?
答案 0 :(得分:4)
这不是“maxThreads”的意思。线程池调度程序的工作是保持活动线程的数量等于“minThreads”。只有当这些线程没有在合理的时间内完成(合理的是半秒)时,调度程序才会使另一个线程可用于尝试解决积压问题。 “maxThreads”值设置了它可用的其他线程的上限。
所以你真正想测试的是检查可用线程的数量是否等于或大于“minThreads”。
这是一种非常糟糕的做法,你的代码只会陷入僵局。当代码意外地与您不熟悉的Timer或TP线程同步时会发生这种情况,因为它们是由.NET Framework代码启动的。等待TP线程可靠地完成需要编写显式代码来检查条件,这些线程必须在退出时发出同步对象的信号,以便您可以使用WaitHandle.WaitAll()。最好用Task.WaitAll()方法完成。