您可以在線程池隊列中放入多少項目是否存在一些限制?您可以在線程池中排隊多少個工作項目是否有限制?
ThreadPool.QueueUserWorkItem(someCallBack);
MSDN沒有給出任何指示什麼限制是,如果你可能傳遞會發生什麼(是否暫時停止其發佈線程?還是它拋出一個異常?)
舉個例子。如果我只在隊列中排隊100,000個項目會怎麼樣?這會工作嗎?
您可以在線程池隊列中放入多少項目是否存在一些限制?您可以在線程池中排隊多少個工作項目是否有限制?
ThreadPool.QueueUserWorkItem(someCallBack);
MSDN沒有給出任何指示什麼限制是,如果你可能傳遞會發生什麼(是否暫時停止其發佈線程?還是它拋出一個異常?)
舉個例子。如果我只在隊列中排隊100,000個項目會怎麼樣?這會工作嗎?
沒有理論上的限制排隊的項目數,應該不斷增加回調隊列中,直到你耗盡你的資源。
但是,你爲什麼要補充一點,很多擺在首位?如果你有很多項目需要添加,他們可能非常短暫,你最好爲你的任務找到一個更好的分區方案。
可以使用Threadpool.GetMaxThreads()和Threadpool.SetMaxThreads()來確定/修改在池中的線程的最大數量。
當你排隊一個工作項目,將開始執行從池中的空閒線程如果可能的話,或者如果所有線程都很忙,它將等待,直到某個線程變得開始執行之前可用。如果排隊某些內容並且沒有可用的空閒線程,則不會出現錯誤。
我認爲唯一的限制是最大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);
}
你是對的,這個例子有點誇張。我只是想知道是否在將某些事情放在隊列中時需要額外的邏輯,以便在某個時候獲得。所以我需要擔心這個問題,並讓我自己的隊列進行節流,然後轉發,或者最大意圖和目的是線程隊列'無限'隊列 – Toad 2011-05-09 20:47:10
如果你想扼殺他們,你應該讓自己的隊列管理器限制您發佈的項目數量,以及您的每個員工在完成時發出的信號。然後經理將對剩餘的物品進行排隊,直到他們全部處理完畢。我看到這樣做的唯一優點是,在您的工作線程甚至被啓動之前,您將有機會中止處理。否則,我會把他們全部排隊,讓他們離開。此外,有關使用GetMaxThreads和SetMaxThreads的註釋與線程池中的項目數量無關 - 這不是問題所在。 – MDF 2011-05-10 16:47:47