等待线程池的线程完成

时间:2013-11-08 10:02:42

标签: c# visual-studio-2012 threadpool

我有这个方法:

/// <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的线程窗口中看到?

1 个答案:

答案 0 :(得分:4)

这不是“maxThreads”的意思。线程池调度程序的工作是保持活动线程的数量等于“minThreads”。只有当这些线程没有在合理的时间内完成(合理的是半秒)时,调度程序才会使另一个线程可用于尝试解决积压问题。 “maxThreads”值设置了它可用的其他线程的上限。

所以你真正想测试的是检查可用线程的数量是否等于或大于“minThreads”。

这是一种非常糟糕的做法,你的代码只会陷入僵局。当代码意外地与您不熟悉的Timer或TP线程同步时会发生这种情况,因为它们是由.NET Framework代码启动的。等待TP线程可靠地完成需要编写显式代码来检查条件,这些线程必须在退出时发出同步对象的信号,以便您可以使用WaitHandle.WaitAll()。最好用Task.WaitAll()方法完成。