MaxDegreeOfParallelism 不适用于任务列表?
MaxDegreeOfParallelism Not Applying to list of Tasks?
我有一个任务列表,我想以有限的方式并行执行,几乎就像批处理一样,无需我管理。我的方法是使用 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());
}
}
这是输出:
我的做法或理解有误吗?
我觉得你有点困惑,最大并行度适用于并行 ForEach 使用的任务数量,但在你创建新任务的内部,这些不是由 ParallelOptions 控制的,而是由任务调度程序。
如果您想限制并发任务的数量,您必须创建一个自定义的 TaskScheduler 并限制任务的数量运行。
Here你可以找个例子。
我有一个任务列表,我想以有限的方式并行执行,几乎就像批处理一样,无需我管理。我的方法是使用 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());
}
}
这是输出:
我的做法或理解有误吗?
我觉得你有点困惑,最大并行度适用于并行 ForEach 使用的任务数量,但在你创建新任务的内部,这些不是由 ParallelOptions 控制的,而是由任务调度程序。
如果您想限制并发任务的数量,您必须创建一个自定义的 TaskScheduler 并限制任务的数量运行。
Here你可以找个例子。