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

c# - running multiple sets of parallel threads (Parallel.ForEach)

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

这通常是因为 A 组任务开始,然后 B 组任务开始,所有任务在他们的组内并行工作,A 组 运行ning 将 B 组 运行s并且组 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();
            }));

问题是 a 组任务不一定在 b 组任务完成之前完成,因此在某些情况下,当 a 组仍在 运行ning 时函数退出。

我想我可以重写它以便它们都可以互操作,可能是通过使用任务集合的集合进行并行循环的并行循环,但这是否会对线程管理等产生一些不利影响在clr里面?

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

你可以直接使用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 界面及其难以推断发生了什么