MaxDegreeOfParallelism 不适用于任务列表?

Sea*_*poe 3 c# task task-parallel-library parallel.foreach

我有一个任务列表,我想以有限的方式并行执行,几乎就像批处理,而无需我管理它。我的方法是使用 Parallel.ForEach 和 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出: 控制台输出

我的方法或理解不正确吗?

Gus*_*man 5

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

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

在这里您可以找到一个示例。