簡體   English   中英

控制C#中並發線程數的最佳方法

[英]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--;
}

我敢肯定這不是正確的解決方法,還有更好的方法嗎?

信號量是執行此操作的常用技術。

為什么不使用內置的東西,如:

  1. 線程池ThreadPool.QueueUserWorkItem
  2. 任務並行庫
  3. 並行LINQ
  4. Parallel.ForEach

例:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM