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

时间:2015-12-18 11:27:27

标签: c# multithreading task-parallel-library

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

任何人都可以通过示例提供解决方案。

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

1 个答案:

答案 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个线程同时执行了所有操作,并执行了此操作。