2011-05-09 31 views
4

您可以在線程池隊列中放入多少項目是否存在一些限制?您可以在線程池中排隊多少個工作項目是否有限制?

ThreadPool.QueueUserWorkItem(someCallBack); 

MSDN沒有給出任何指示什麼限制是,如果你可能傳遞會發生什麼(是否暫時停止其發佈線程?還是它拋出一個異常?)

舉個例子。如果我只在隊列中排隊100,000個項目會怎麼樣?這會工作嗎?

回答

2

沒有理論上的限制排隊的項目數,應該不斷增加回調隊列中,直到你耗盡你的資源。

但是,你爲什麼要補充一點,很多擺在首位?如果你有很多項目需要添加,他們可能非常短暫,你最好爲你的任務找到一個更好的分區方案。

+0

你是對的,這個例子有點誇張。我只是想知道是否在將某些事情放在隊列中時需要額外的邏輯,以便在某個時候獲得。所以我需要擔心這個問題,並讓我自己的隊列進行節流,然後轉發,或者最大意圖和目的是線程隊列'無限'隊列 – Toad 2011-05-09 20:47:10

+1

如果你想扼殺他們,你應該讓自己的隊列管理器限制您發佈的項目數量,以及您的每個員工在完成時發出的信號。然後經理將對剩餘的物品進行排隊,直到他們全部處理完畢。我看到這樣做的唯一優點是,在您的工作線程甚至被啓動之前,您將有機會中止處理。否則,我會把他們全部排隊,讓他們離開。此外,有關使用GetMaxThreads和SetMaxThreads的註釋與線程池中的項目數量無關 - 這不是問題所在。 – MDF 2011-05-10 16:47:47

2

可以使用Threadpool.GetMaxThreads()和Threadpool.SetMaxThreads()來確定/修改在池中的線​​程的最大數量。

當你排隊一個工作項目,將開始執行從池中的空閒線程如果可能的話,或者如果所有線程都很忙,它將等待,直到某個線程變得開始執行之前可用。如果排隊某些內容並且沒有可用的空閒線程,則不會出現錯誤。

+0

所以你的意思是這是做queing將「等待線程「?或者只是將所有事情排隊等待,同時隨着線程可用,隊列將逐一清空? – Toad 2011-05-09 20:27:14

+2

「高於該數字的所有請求都會保持排隊,直到線程池線程可用。」據我瞭解,它只是把它們放在隊列中並立即返回。 – 2011-05-09 20:51:10

+0

Vladislav Zorov是對的,將項目添加到隊列中的線程根本不會等待,QueueUserWorkItem方法將立即返回並允許調用線程繼續處理。排隊的項目將保留在隊列中,直到線程空閒開始執行。 – Venr 2011-05-10 16:06:02

0

我認爲唯一的限制是最大UInt32.MaxValue都可以在隊列中。如果你使用32位的CLR,你會提前很長一段時間,所以你永遠不會達到這個限制。

我想在64位CLR理論上你就可以打的限制,但我認爲你需要左右的內存來測試它850GB。在啓動內存耗盡之前(在安裝了8GB RAM的計算機上),我使用6-7GB的工作集合,使用了約4,000萬個排隊項目。

我不知道如果你達到極限會發生什麼。從帶有反射器的mscorlib快速瀏覽一下,它甚至可能不會拋出異常,而只是溢出了不可預測的結果。

如果你有一臺機器大約1TB的內存,這裏有一個小的測試片段來嘗試,看看自己會發生什麼:)

class Program 
    { 
     static void Main(string[] args) 
     { 
      for (long i = 0; ; ++i) 
      { 
       bool succeeded = ThreadPool.QueueUserWorkItem(SleepCallBack); 
       if ((i % 1000) == 0) 
       { 
        Console.WriteLine(i); 
       } 
       if (!succeeded) break; 
      } 
      Console.Read(); 
     } 

     private static void SleepCallBack(object stateInfo) 
     { 
      Thread.Sleep(System.Threading.Timeout.Infinite); 
     } 
相關問題