繁体   English   中英

等待线程池的线程完成

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM