c# - MaxDegreeOfParallelism = 2 显示 3 个线程

标签 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个thread Id,但是我已经指定了MaxDegreeOFParallelism只有2。那为什么是3个thread而不是2个呢?

最佳答案

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

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

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

关于c# - MaxDegreeOfParallelism = 2 显示 3 个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20733051/

相关文章:

c# - 基于需要在执行时间内接收更多项目的列表执行 Parallel.ForEach

c# - MVC4 : same url base for different actions

c# - 如何使用任务或并行调用以正确的顺序获得翻译结果?

c# - Unity手机SSL连接错误

caching - block 矩阵矩阵乘法的最佳 block 大小值

ruby-on-rails-3 - 如何使用parallel_tests运行标记的rspec测试?

c# - AsParallel() 的最大并行度

c# - 如何防止 Parallel.ForEach 循环在运行时更改任务数?

c# - 自动登录进入c#项目中的每个方法

c# - 在 Controller 外设置 ViewData