MaxDegreeOfParallelism不适用于任务列表?

时间:2016-11-29 19:45:10

标签: c# task-parallel-library task parallel.foreach

我有一个我希望并行执行的任务列表,但是以有限的方式执行,几乎就像在没有管理它的情况下进行批处理。我的方法是使用ParallelOForach和ParallelOptions的MaxDegreeOfParallelism属性。我发现无论我将值设置为什么,所有任务都会同时开始。这是不受欢迎的行为。我希望并发执行的任务量等于属性。我写了一个简单的插图示例

class Program
{
    static void Main(string[] args)
    {
        var numbers = Enumerable.Range(1, 5);
        var tasks = new List<Task>();

        foreach (int number in numbers)
        {
            tasks.Add(new Task(() => {Console.WriteLine("Starting thread {0} at time {1}. Starting delay...", Thread.CurrentThread.ManagedThreadId, DateTime.Now);
            Thread.Sleep(1000);
            Console.WriteLine("{0} is done at {1}.", Thread.CurrentThread.ManagedThreadId, DateTime.Now);}));
        }

        Parallel.ForEach(tasks, new ParallelOptions() { MaxDegreeOfParallelism = 2 }, t =>
        {
            t.Start();
        });

        Task.WaitAll(tasks.ToArray());
    }
}

这是输出: Console Output

我的方法或理解是否不正确?

1 个答案:

答案 0 :(得分:4)

我认为你有点困惑,最大程度的并行度应用于并行ForEach使用的任务数量,但在你内部创建新任务,这些不受ParallelOptions控制但是由TaskScheduler。

如果要限制并发任务的数量,则必须创建自定义TaskScheduler并限制正在运行的任务数。

Here你可以找到一个例子。