5

この例ではParallel.For、関数を一度に実行できるスレッドの数を10に制限したい場合、これはループの正しい使用法DoWorkですか?10個のスレッドの1つが使用可能になるまで、他のスレッドはブロックされますか?そうでない場合でも、その関数を6000回以上実行できる、より優れたマルチスレッドソリューションは何ですか?

class Program
{
    static void Main(string[] args)
    {
        ThreadExample ex = new ThreadExample(); 
    }
}

public class ThreadExample
{
    int limit = 6411; 

    public ThreadExample()
    {
        Console.WriteLine("Starting threads...");
        int temp = 0; 
        Parallel.For(temp, limit, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i =>
        {
            DoWork(temp);
            temp++; 
        }); 
    }

    public void DoWork(int info)
    {
        //Thread.Sleep(50); //doing some work here. 

        int num = info * 5; 

        Console.WriteLine("Thread: {0}      Result: {1}", info.ToString(), num.ToString());
    }
}
4

1 に答える 1

16

iラムダ関数に渡されたものをインデックスとして使用する必要があります。Parallel.Forループカウンターを操作する手間が省けますが、使用する必要があります。

    Parallel.For(0, limit, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i =>
    {
        DoWork(i);
    });

あなたの他の質問に関して:

  • はい、これにより同時に動作するスレッドの数が正しく制限されます。
  • ブロックされているスレッドはありません。反復はキューに入れられ、スレッドが使用可能になるとすぐに、キューから次の反復が(同期された方法で)処理されます。
于 2013-01-08T18:59:37.523 に答える