使用任务并行性动态创建在队列中运行某些方法的任务

本文关键字:任务 运行 方法 并行性 动态 创建 队列 | 更新日期: 2023-09-27 18:27:15

我们有一个动态创建任务的场景(假设有5个任务),并将5个任务分配给某个进程(假设有15个方法)。我希望5个任务一次采用5种方法,如果任何一个任务完成了,就应该采用另一种方法。

有人能举例说明解决方案吗。

一旦任何任务完成,我们必须将方法放入队列中,以采用另一种方法。

使用任务并行性动态创建在队列中运行某些方法的任务

您不需要实现任何队列,可以使用Parallel.ForEach
这正是它的设计初衷。以下示例显示了Parallel.ForEach的最简单用法。Stopwatch不是此功能的一部分,它仅用于测量执行时间。

Stopwatch sw = new Stopwatch();
List<Action> actions = new List<Action>();
actions.Add(() => { Thread.Sleep(1000); Console.WriteLine($"1 - {sw.ElapsedMilliseconds}"); });
actions.Add(() => { Thread.Sleep(10000); Console.WriteLine($"2 - {sw.ElapsedMilliseconds}"); });
actions.Add(() => { Thread.Sleep(3000); Console.WriteLine($"3 - {sw.ElapsedMilliseconds}"); });
actions.Add(() => { Thread.Sleep(3000); Console.WriteLine($"4 - {sw.ElapsedMilliseconds}"); });
sw.Start();
Parallel.ForEach(actions, new ParallelOptions
{
    MaxDegreeOfParallelism = 2
}, action => action());

MaxDegreeOfParallelism指定应该有多少线程在运行您的操作。

如果在上述代码中MaxDegreeOfParallelism设置为1,则这些操作将由单个线程执行:

1 - 1002
2 - 11002
3 - 14002
4 - 17003

对于设置为2MaxDegreeOfParallelism,输出如下:

1 - 1029
3 - 3005
4 - 6009
2 - 11049

请注意,它不维护收款顺序。可以观察到,在开始时,两个线程执行了操作1和3。然后,线程1采取动作2,线程2采取动作4。

对于MaxDegreeOfParallelism等于4,输出显然如下:

1 - 1029
3 - 3005
4 - 6009
2 - 11049

因为4个线程同时执行了所有操作。