2012-07-12 113 views
1

我需要一些關於多線程的建議。多線程 - 產生多線程並等待

例如:我想產生200個線程,每個應該從一個網站抓取一個不同的圖像(該網站有點慢)。但應該有最大值。 40個線程一次。

有什麼想法?

我期待着一些答案。

+1

查看.NET 4.0 Task Parallel Library。 – Steven 2012-07-12 12:17:56

+0

確實,使用TPL(http://msdn.microsoft.com/zh-cn/library/dd460717.aspx)。 40從哪裏來?讓TPL調度機制決定要運行多少個併發任務,這很好。 – Maarten 2012-07-12 12:20:26

+0

40和200是變量,用戶可以輸入。我會看看tpl,謝謝。 – Mek 2012-07-12 12:24:45

回答

2

您可以輕鬆使用ThreadPool。池並管理線程的一個很好的工作,但如果你真的必須限制的最大數量,你可以使用:

ThreadPool.SetMaxThreads(40, 40); 

// submit 200 tasks to the pool 
for(int i = 0; i < 200; i++) 
{ 
    ThreadPool.QueueUserWorkItem(
     () => 
     { 
      // code for each task 
     }); 
} 

不幸的是,沒有內置的方式來等待任務完成,所以你只需要即興創作。如果您有權訪問.NET 4.0,則可以檢出Parallel.For

ParallelOptions po = new ParallelOptions(); 
po.MaxDegreeOfParallelism = 40; 
Parallel.For(0, 200, po, 
    i => 
    { 
     // code for each task 
    }); 
+0

我打算做出同樣的答案......對於ThreadPool,他可以使用一個帶有上下文參數的回調函數來保存關於特定線程的信息。 – PedroC88 2012-07-12 13:28:31

+0

謝謝!這真的很有用。 – Mek 2012-07-12 13:52:16

1

使用線程安全隊列,並填充所需的所有URL。

創建40個線程,其工作是從隊列中取下一個項目並從URL下載。當隊列爲空時,線程應該完成。

+0

我也會使用這個解決方案。 – laszlokiss88 2012-07-12 12:17:07

+0

使用'ThreadPool'類似乎更容易,因爲它封裝了所有上述機制。 – Tudor 2012-07-12 12:52:19

0

嘗試

SlimSemaphore slm=new SlimSemaphore(40); 

slm.Wait() 

[your code] 

slm.Release(); 

這將只允許40線程同時執行。

注:SlimSemaphore(如果使用.NET Framework 4.0) 其他 信號燈

only efficiency difference is there 
0

您可以使用ParallelOptions設置MaxDegreeParallelism對象創建和供應的Parallel.ForEach loop.I會粘貼一些代碼當我稍後再次在適當的鍵盤後面時。