我们有动态创建任务的场景(假设5个任务)并将5个任务分配给某个进程(假设有15个方法)。 我希望5个任务一次采用5个方法,如果任何一个任务完成,它应采取另一种方法。
任何人都可以通过示例提供解决方案。
一旦完成任务,我们必须将方法放在队列中以采用另一种方法。
答案 0 :(得分:1)
您无需实施任何队列,也可以使用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
MaxDegreeOfParallelism
设置为2 ,输出如下:
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个线程同时执行了所有操作,并执行了此操作。