【问题标题】:Create the tasks dynamically that run some methods in queue using task parallelism?使用任务并行性动态创建在队列中运行某些方法的任务?
【发布时间】:2015-12-18 19:41:36
【问题描述】:

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

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

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

【问题讨论】:

标签: c# multithreading task-parallel-library


【解决方案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 个线程同时采取了所有的动作,并执行了这个。

【讨论】:

  • 感谢您的解决方案,但就我而言,我想要带有参数的操作。例如 List> actions = new List>();
  • @user3336576 只需将其更改为 Action 并以相同的方式使用它。
猜你喜欢
  • 2016-08-28
  • 2017-05-09
  • 1970-01-01
  • 2011-07-28
  • 2015-08-23
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多