2011-05-14 165 views
24

我有一些麻煩,.NET的線程池(.NET 4)。線程池最大線程

我讀過,在默認情況下.NET爲每處理器25個線程的限制,但根據對SO和其他地方的論壇帖子,我可以增加限制與下面的代碼。

void SetThreads(int threads) 
{ 
    ThreadPool.SetMaxThreads(threads, threads); 
    ThreadPool.SetMinThreads(threads, threads); 
} 

然而,當我設定在上述的一些任意高數,例如,2000和隊列〜1000個項目,我仍然只有33〜線程中運行(.NET CLR花費〜5個線程),和ThreadPool.GetAvailableThreads()返回剩餘的1971個線程。

爲什麼沒有上述工作的代碼?

+0

你是如何在線程池中排隊的任務?顯示你的測試代碼可能真的有幫助。 –

+0

你的問題是,你應該運行_less_多於33個線程,而不是更多。 –

+0

@Henk Holterman,這不是一個大的應用程序 - 這是一個快速怪人在職HTTP負載生成我做了嘗試,並加載本地Web服務器與一羣請求。不幸的是它並沒有那麼好。 – foxy

回答

8

From the MSDN

當需求低迷,線程池中的線程的實際數量可能下降 低於最低值。

閱讀本太:Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4

+0

我排隊〜50k任務,並將ThreadPool的最小+最大線程設置爲20k,但只使用了約25個線程。這是預期的嗎? – foxy

+0

是否有任何/任務完成或處於等待狀態?由經理來創建線程。在某些機器上,沒有太多線程可能會更好,因爲線程會遭受線程匱乏。 –

1

首先檢查this link,尤其是這句話:

如果公共語言運行庫託管,例如通過互聯網 信息服務(IIS)或SQL Server ,主機可以限制或防止更改線程池大小。

然後你應該檢查返回值ThreadPool.SetMaxThreads(threads, threads)方法。也許它返回false

+0

謝謝,我在Windows 7上使用.NET 4。 – foxy

65

首先,您的默認的「知識」是不正確。每個處理器25個線程的限制是從.NET 1.1返回的。這是在.NET 2,and now增加:

從.NET Framework 4版開始,某個進程的線程池的默認大小取決於幾個因素,如虛擬地址空間的大小。進程可以調用GetMaxThreads方法來確定線程的數量。

然而,還有其他的東西在作怪:線程池不立即創建在所有情況下新主題。爲了應對突發性的小任務,它限制了創建新線程的速度。 IIRC,如果有未完成的任務,它將每0.5秒創建一個線程,直到最大線程數。我不能立即看到那個數字,所以它可能會改變。我強烈懷疑這就是你所看到的。嘗試排隊很多項目,然後隨着時間的推移監控線程數量。

+1

這應該是公認的答案,它清楚地解釋了自由和平正在經歷的事情 – Fayilt

+1

這就是答案!我注意到奇怪的半秒鐘,有時一秒鐘,它什麼都沒做。我有等待任務和其他任務等待開始的結果,並且一切都很慢。我的工作需要大約10個線程。將ThreadPool.SetMinThreads設置爲20(默認爲8),工作線程立即解決了我的問題!因爲我以後也需要這些線程,所以我不會再減少最小值。 – ygoe