[英]Best way of controlling the number of simultaneous threads in 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.
}
這很好用,但是我遇到了限制同時運行的thead數量的問題。 例如,我想定義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--;
}
我敢肯定這不是正確的解決方法,還有更好的方法嗎?
信號量是執行此操作的常用技術。
為什么不使用內置的東西,如:
例:
Parallel.ForEach(objList,doSomething);
如果使用.net 2.0或更高版本,則可以使用信號量。
如果線程數大於信號量對象中指定的限制,則信號量將允許您定義最大數量限制,以及何時可以釋放信號量對象以進入等待線程。
您可以使用.net 4附帶的Task並行庫來執行此操作。
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
如果使用4.0之前的.net,則應編寫多線程生產者使用者隊列。 在構造函數中,您可以指定工作線程限制。 這樣做的好處是,您可以將工作線程創建和線程同步與實際功能代碼分開。 Web和StackOverflow上有很多示例。
如果您使用的是.net 4.0; 顯然有System.Collections.Concurrent類型供您查看,以及前面提到的Parallel類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.