类设计和优雅等待

本文关键字:等待 | 更新日期: 2023-09-27 18:36:12

我正在做一个小项目,需要等到所有作业都完成。细节是这样的:

  1. 有一个 Web 服务器,我可以将作业发布到它并查询作业的状态。它有一些 REST API 来做到这一点。

  2. 每个作业都表示为一个 json 文件,其中包含执行某些操作的步骤。

  3. 我需要将 5 个作业
  4. 发布到服务器,并每 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));
    }
}