2010-11-24 59 views
2

我有一個簡單的多線程程序,結構如下。控制c中併發線程數的最佳方式#

public void someFunction() 
{ 

    List<object> objList = new List<object>(); 
    //objList populated here 

    foreach(object o in objList) 
    { 
     Thread aThread = new Thread (new ParameterizedThreadStart(doSomething)); 
     aThread.Start(o); 
    } 
} 

static void doSomething(object o) 
{ 
    //Do something with o. 
} 

這很好,但我遇到了限制同時運行的數量的問題。假設我想定義int maxThreads = 25爲例。我能想到這樣做的最好的辦法是這樣的:

SomeThreadsafeCounter c = new SomeThreadsafeCounter(); 

foreach(object o in objList) 
{ 
    while (c < 26){ wait; } 
    c++; 
    Thread aThread = new Thread (new ParameterizedThreadStart(doSomething)); 
    aThread.Start(o); 
    c--; 
} 

我敢肯定這是不是去做正確的方法,有沒有更好的辦法?

+0

除非`doSomething`正在做一些非常繁重的工作,否則您可能會浪費大量時間爲每次調用產生一個新線程。 – 2010-11-24 10:53:09

回答

1

您可以使用任務並行庫做到這一點包含.NET 4

ParallelOptions options = new ParallelOptions(); 
options.MaxDegreeOfParallelism = 25; 

Parallel.ForEach(objList, options, item => doSomething(item)); 

Parallel.ForEach有許多重載的,我不知道,我這裏有一個正確。

此處瞭解詳情:http://msdn.microsoft.com/en-us/library/dd537608.aspx

1

如果使用.net 2.0或更高版本,則可以使用信號量。

信號量可以讓你定義一個最大限制的threds,當你可以釋放信號量對象來進入等待線程,如果線程數大於信號量對象中​​指定的限制。

1

如果您使用的是.NET 4.0之前的,那麼你應該寫一個多線程的生產者消費者隊列。在構造函數中,您可以指定您的工作線程限制。這樣做的好處是,您可以將您的工作線程創建和線程同步與您的實際功能代碼分開。網絡和StackOverflow上有很多例子。

如果您使用.net 4.0;顯然有你看到的System.Collections.Concurrent類型和前面提到的Parallel類型。