簡體   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