类设计和优雅等待
本文关键字:等待 | 更新日期: 2023-09-27 18:36:12
我正在做一个小项目,需要等到所有作业都完成。细节是这样的:
-
有一个 Web 服务器,我可以将作业发布到它并查询作业的状态。它有一些 REST API 来做到这一点。
-
每个作业都表示为一个 json 文件,其中包含执行某些操作的步骤。
我需要将 5 个作业 发布到服务器,并每 5 分钟轮询一次每个作业的状态。返回状态字符串将为"进行中"或"成功"
主机程序应等到所有作业状态都为"成功",然后再继续后续步骤。
并优雅地等待工作状态成功有一些疑问。我目前有一个Timer
集,每 5 分钟触发一次,并轮询作业结果。主线程将执行以下操作:
while(!AllJobsFinished){}
我知道这种方法很糟糕。所以问题是我怎样才能设计类来更优雅地等待完成?
您可以将每个作业表示为单独的Task
,然后使用Task.WhenAll()
等待它们完成:
List<Task> jobs = …;
await Task.WhenAll(jobs);
要获得该Task
,请创建一个执行轮询的async
方法。如果有意义,您可以将其合并为创建作业的单个方法:
public Task RunJobAsync(JobData data)
{
JobId id = await PostJobAsync(data);
while (true)
{
JobStatus status = await QueryJobStatusAsync(id);
if (status == JobStatus.Success)
break;
await Task.Delay(Timespand.FromMinutes(5));
}
}