0

我有这个方法:

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

4

1 回答 1

4

这不是“maxThreads”的意思。线程池调度程序的工作是保持活动线程的数量等于“minThreads”。只有当这些线程没有在合理的时间内完成时(合理的是半秒),调度程序才会让另一个线程可以尝试处理积压。“maxThreads”值设置了它提供多少额外线程的上限。

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

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

于 2013-11-08T11:36:19.470 回答