我正在做一个小项目,需要等到所有工作完成。细节是这样的:
有一个Web服务器,我可以向其发布作业并查询作业的状态。它有一些REST apis来做到这一点。
每个作业都表示为一个json文件,其中包含执行某些操作的步骤。
我需要向服务器发布5个作业,并每5分钟轮询一次作业的状态。返回状态字符串将是" InProgress"或者"成功"
主持人程序应该等到所有工作状态为"成功"在继续下一步之前。
我有一些关于轮询工作状态的问题,并且优雅地等待工作状态取得成功。我目前有一个Timer
集,每5分钟触发一次,并轮询作业结果。主线程将执行以下操作:
while(!AllJobsFinished){}
我知道这种方法很糟糕。所以问题是如何设计类以更优雅地等待完成?
答案 0 :(得分:1)
您可以将每个作业表示为单独的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));
}
}