2012-03-13 18 views

回答

7

在.NET4.0 32位系統上,ThreadPool中的最大線程數設置爲大約1000個線程。對於較舊版本的.NET來說,這是較少的。如果你有1000個線程正在進行,說他們因爲某種原因阻塞了,當你排隊1001st任務時,它永遠不會執行。

您將永遠不會在32位進程中達到最大線程數。請記住,每個線程至少需要1MB內存(即用戶模式堆棧的大小)以及其他開銷。您已經從CLR和本機DLL中加載了很多內存,因此在使用多個線程之前,您會遇到OutOfMemoryException。

通過調用ThreadPool.SetMaxThreads方法,可以更改ThreadPool可以使用的線程數。但是,如果您期望使用這麼多的線程,那麼您的代碼會出現更大的問題。我做不是建議你搞亂像ThreadPool配置。你很可能會變得更糟糕的表現。

請注意TaskThreadPool.QueueUserWorkItem,線程在完成時會被重新使用。如果您創建任務或隊列線程池線程,它可能可能可能不會創建一個新的線程來執行您的代碼。如果池中已有可用的線程,它將重新使用其中的一個,而不是創建(昂貴的)新線程。只有當你在任務中執行的方法永遠不會返回時,如果你擔心線程耗盡,但正如我所說的那樣,這與代碼完全不同。

+0

我假設如果其中一個線程取消了 – Jon 2012-03-13 17:03:24

+0

@Jon,那麼1001st線程將被排隊並執行,這是正確的。那麼,在一個32位系統上,如果沒有內存不足,你不可能執行1000個線程,但是,假設沒有發生,那麼線程最終將在線程釋放時運行。 – 2012-03-13 17:05:29

+0

+1有關每個線程的內存使用情況的詳細信息 – 2012-03-13 17:07:39

6

默認情況下,ThreadPool的MaxThreads非常高。通常你永遠不會到達那裏,你的應用會首先崩潰。

因此,當所有線程都忙時,新任務排隊並緩慢排隊,每500毫秒最多1個,TP將分配新線程。

+0

任何方式來大致瞭解MaxThreads屬性是什麼? – Jon 2012-03-13 16:55:19

+0

您調用[ThreadPool.GetMaxThreads方法](http://msdn.microsoft.com/en-us/library/system.threading.threadpool.getmaxthreads%28v=vs.100%29.aspx) – 2012-03-13 16:57:14

4

它不會增加MaxThreads。當有更多的任務比可用的工作線程多時,一些任務將排隊並等待直到線程池提供可用的線程。它有一些相當先進的東西來擴展大量內核(工作竊取,線程注入等)。

+1

它不會增加MaxThreads。它絕對可以做一些新的線程 – 2012-03-13 16:58:06

+0

吶,澄清。謝謝。 – 2012-03-13 17:04:12

相關問題