【发布时间】:2022-07-08 06:00:51
【问题描述】:
我有一份我想并行执行的作业列表,但其中一些只能在其他作业完成后才能开始。例如:作业 A 和 B 可以立即开始,作业 C 可以在 A 完成后开始,作业 D 可以在 A 和 B 都完成时开始。我事先不知道确切的顺序,因为它来自配置。
我希望我可以创建所有任务,启动其中一些任务,然后在每个任务完成后,检查我是否可以启动其他任务。简化后的代码如下所示:
public class Job { }
List<Job> _jobsList;
List<Task> _taskList;
private async Task RunJobs()
{
foreach (var job in _jobsList)
{
_taskList.Add(new Task(async () => await RunJob(job)));
}
StartJobs();
await Task.WhenAll(_taskList);
}
private void StartJobs()
{
foreach (var task in _taskList)
{
//some logic here to determine which jobs can start now
if (canstart)
{
task.Start();
}
}
}
private async Task RunJob(Job job)
{
//await some async processing
StartJobs(); //to start other jobs depending on this one
}
不幸的是,这不起作用 - Task.WhenAll 在一些任务仍在运行时完成。如果我理解正确,问题是因为 Task 构造函数不能与异步方法一起正常工作,我必须改用 Task.Run 。我能想到的所有解决方法都相当复杂。有没有办法以某种方式简单地实现这一目标?
提前谢谢你。
【问题讨论】:
标签: .net multithreading async-await