我需要一些關於多線程的建議。多線程 - 產生多線程並等待
例如:我想產生200個線程,每個應該從一個網站抓取一個不同的圖像(該網站有點慢)。但應該有最大值。 40個線程一次。
有什麼想法?
我期待着一些答案。
我需要一些關於多線程的建議。多線程 - 產生多線程並等待
例如:我想產生200個線程,每個應該從一個網站抓取一個不同的圖像(該網站有點慢)。但應該有最大值。 40個線程一次。
有什麼想法?
我期待着一些答案。
您可以輕鬆使用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
});
使用線程安全隊列,並填充所需的所有URL。
創建40個線程,其工作是從隊列中取下一個項目並從URL下載。當隊列爲空時,線程應該完成。
我也會使用這個解決方案。 – laszlokiss88 2012-07-12 12:17:07
使用'ThreadPool'類似乎更容易,因爲它封裝了所有上述機制。 – Tudor 2012-07-12 12:52:19
嘗試
SlimSemaphore slm=new SlimSemaphore(40);
slm.Wait()
[your code]
slm.Release();
這將只允許40線程同時執行。
注:SlimSemaphore(如果使用.NET Framework 4.0) 其他 信號燈
only efficiency difference is there
您可以使用ParallelOptions設置MaxDegreeParallelism對象創建和供應的Parallel.ForEach loop.I會粘貼一些代碼當我稍後再次在適當的鍵盤後面時。
查看.NET 4.0 Task Parallel Library。 – Steven 2012-07-12 12:17:56
確實,使用TPL(http://msdn.microsoft.com/zh-cn/library/dd460717.aspx)。 40從哪裏來?讓TPL調度機制決定要運行多少個併發任務,這很好。 – Maarten 2012-07-12 12:20:26
40和200是變量,用戶可以輸入。我會看看tpl,謝謝。 – Mek 2012-07-12 12:24:45