2010-12-07 100 views
5

我有一個函數,它處理6100個列表項的列表。當列表只有300個項目時,代碼用於工作。但是6100會立即崩潰。有沒有一種方法可以循環訪問這6100個項目,每次30個,併爲每個項目執行一個新的線程?C#.net For()Step?

for (var i = 0; i < ListProxies.Items.Count; i++) 
    { 
     var s = ListProxies.Items[i] as string; 
     var thread = new ParameterizedThreadStart(ProxyTest.IsAlive); 
     var doIt = new Thread(thread) { Name = "CheckProxy# " + i }; 
     doIt.Start(s); 
    } 

任何幫助將不勝感激。

+3

爲了記錄,發現並命名什麼崩潰(行)和崩潰消息有助於尋找解決方案 – Eric 2010-12-07 03:54:09

回答

10

真的需要爲每個工作項目產生一個新的線程?除非真的需要這個(如果是這樣,請告訴我們爲什麼),我強烈建議您改用Managed Thread Pool。這將爲您提供所需的併發優勢,但卻沒有運行數千個線程的資源需求(以及創建,銷燬和上下文切換成本)。如果您使用的是.NET 4.0,則可能還需要考慮使用Task Parallel Library

例如:

for (var i = 0; i < ListProxies.Items.Count; i++) 
{ 
    var s = ListProxies.Items[i] as string; 
    ThreadPool.QueueUserWorkItem(ProxyTest.IsAlive, s);  
} 

在另一方面,我會認真考慮改名,因爲IsAlive方法(它看起來像一個布爾值屬性或方法):

  1. 它顯然有void IsAlive(object)簽名。
  2. 它有可觀察到的副作用(從您的評論中,它「增加進度條並將」工作「代理添加到新列表中))。
+1

ThreadPool絕對是這裏的方式。線程很昂貴。 – lesscode 2010-12-07 03:45:37

3

您可以產生的線程數量有限制。 6100個線程似乎有點過分。

我同意贏得Ani,你應該看看ThreadPool甚至生產者/消費者的過程,這取決於你想要完成什麼。

處理多線程應用程序有很多過程,但不知道你在開始做什麼,實際上沒有辦法推薦除ThreadPool或Producer/Consumer進程以外的任何方法(使用SyncEvents的隊列)。

無論如何,你真的應該儘量保持線程數量降到最低,否則你會冒線程鎖,自旋鎖,等待鎖,死鎖,競態條件,誰知道什麼等等......

如果您希望獲得有關C#線程的良好信息,請查看書籍Concurrent Programming on Windows By Joe Duffy,這非常有幫助。