我正在尝试运行两组并行任务。我的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是一系列短期运行的任务,存储在一个队列。两组具有相同的优先级,并且具有相同的开始和停止时间,队列可以在时间到时停止,并且任何任务都可以在下一个周期重新开始。
答案 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接口,但它很困难。推断发生了什么事