班级设计和优雅等待

时间:2016-02-25 22:50:48

标签: c# asynchronous async-await

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

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

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

  3. 我需要向服务器发布5个作业,并每5分钟轮询一次作业的状态。返回状态字符串将是" InProgress"或者"成功"

  4. 主持人程序应该等到所有工作状态为"成功"在继续下一步之前。

  5. 我有一些关于轮询工作状态的问题,并且优雅地等待工作状态取得成功。我目前有一个Timer集,每5分钟触发一次,并轮询作业结果。主线程将执行以下操作:

    while(!AllJobsFinished){}
    

    我知道这种方法很糟糕。所以问题是如何设计类以更优雅地等待完成?

1 个答案:

答案 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));
    }
}