2016-02-25 26 views
1

我做一個小項目,需要等到所有作業完成。細節是這樣的:類的設計和優雅的等待

  1. 有,我可以發佈職位,並查詢作業的狀態的Web服務器。它有一些REST API可以做到這一點。

  2. 每個作業都表示爲有步驟做的東西JSON文件。

  3. 我需要張貼5個作業的服務器和輪詢每個作業的狀態,每5分鐘。返回狀態的字符串值可以是「INPROGRESS」或「成功」

  4. 主機程序應該等到所有作業狀態繼續下一步驟之前,是「成功」。

我有一些關於輪詢工作狀態和優雅地等待工作狀態成功的問題。我現在有一個Timer組每隔5分鐘輪詢作業結果觸發。主線程會做這樣的事情:

while(!AllJobsFinished){} 

我知道這種方法是不好的。所以問題是我如何設計這些類以更優雅地等待完成?

+0

不確定如果輪詢是唯一可用的操作,則可以做得更好。你有什麼可以改進的想法嗎? – usr

回答

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