MaxDegreeOfParallelism = 2显示3个线程

时间:2013-12-22 19:14:55

标签: c# parallel-processing parallel.foreach

我运行以下代码时:

    public static double SumRootN(int root)
    {
        double result = 0;
        for (int i = 1; i < 10000000; i++)
        {
            result += Math.Exp(Math.Log(i) / root);
        }
        return result;
    }

static void Main()
{
    ParallelOptions options = new ParallelOptions();
    options.MaxDegreeOfParallelism = 2; // -1 is for unlimited. 1 is for sequential. 

    try
    {
        Parallel.For(
                0,
                9,
                options,
                (i) =>
        {
            var result = SumRootN(i);
            Console.WriteLine("Thread={0}, root {0} : {1} ",Thread.CurrentThread.ManagedThreadId, i, result);
        });
            );

    }
    catch (AggregateException e)
    {
        Console.WriteLine("Parallel.For has thrown the following (unexpected) exception:\n{0}", e);
    }
}

我看到输出是: enter image description here

这里有3个线程ID,但是我已经指定MaxDegreeOFParallelism只有2.那么为什么有3个线程在做工作而不是2个呢?

1 个答案:

答案 0 :(得分:4)

来自http://msdn.microsoft.com/en-us/library/system.threading.tasks.paralleloptions.maxdegreeofparallelism(v=vs.110).aspx

默认情况下,For和ForEach将使用底层调度程序提供的许多线程,因此从默认值更改MaxDegreeOfParallelism只会限制将使用多少并发任务。

翻译:在任何给定时刻只会运行2个线程,但可以在线程池之外使用更多(甚至更少)2个线程。您可以在任务开始时使用另一个写行测试它,您将看到没有3个线程将同时进入。