c#-运行多组并行线程(Parallel.ForEach)

时间:2018-10-24 06:39:26

标签: c# multithreading threadpool parallel-for

我正在尝试运行两组并行任务。我的task.Invoke()方法是异步的,因此在第一组任务中,我省略了.Wait();。但是在第二组中,我使用.Wait(),因此在所有任务实际完成之前,它不会退出并行组。

这通常是这样的:首先启动A组任务,然后启动B组任务,所有任务在运行A组的组中并行工作,B组运行,而B组直到其所有任务都退出,任务完成。

            var parallelA = new List<IMyTask>();
            parallelA.Add(new MyTask());
            parallelA.Add(new MyTask());

            await Task.Run(() => Parallel.ForEach(parallelA, task =>
            {
                task.Invoke();
            }));

            var parallelB = new List<IMyTask>();
            parallelB.Add(new MyTask());
            parallelB.Add(new MyTask());

            await Task.Run(() => Parallel.ForEach(parallelB, task =>
            {
                task.Invoke().Wait();
            }));

问题在于,在任务b组完成之前,组a的任务不一定要完成,因此在某些情况下,组a仍在运行时该功能将退出。

我想我可以重新编写它,以便它们都可以互操作,这可能是通过使用一组任务集合进行并行循环的并行循环实现的,但是这会对线程管理等内部产生不利影响。 clr?

背景是我有一个间隔运行的后台进程,我将其分成两个组,组A是几个长期运行的任务,组B是一系列短期运行的任务,存储在一个队列。两组具有相同的优先级,并且具有相同的开始和停止时间,队列可以在时间到时停止,并且任何任务都可以在下一个周期重新开始。

1 个答案:

答案 0 :(得分:3)

您可以只使用WhenAll

var parallelA = new List<IMyTask>();
parallelA.Add(new MyTask());
parallelA.Add(new MyTask());

var task1 = Task.Run(() => Parallel.ForEach(parallelA, task =>
   {
      task.Invoke();
   }));

var parallelB = new List<IMyTask>();
parallelB.Add(new MyTask());
parallelB.Add(new MyTask());

var task2 = Task.Run(() => Parallel.ForEach(parallelB, task =>
   {
      task.Invoke().Wait();
   }));

await Task.WhenAll(task1, task2);

注意,虽然可能有更好的方法,但是您可以只使用任务列表,而根本不使用Parallel.ForEach,尽管您使用的是IMyTask接口,但它很困难。推断发生了什么事

相关问题