2017-07-03 58 views
0

我要問你的時候:我有代碼:指派屬性,任務完成

var task1 = await _connectionService.ValidateUriAsync(uri1); 
     OutputResult("ss", task1); 
     var task2 = await _connectionService.ValidateUriAsync(uri2); 
     OutputResult("bb", task2); 
     var task3 = await _connectionService.ValidateUriAsync(uri3); 
     OutputResult("cc", task3); 

現在我在等待,直到每個任務完成,然後我將結果輸出。但我想獨立運行所有任務(我知道該怎麼做)。但是我不知道的是,當某個任務完成時,我需要輸出每個任務的結果。如果任務失敗,則輸出將爲 - task1失敗或Task1成功。 我試過這個解決方案,但我將不得不檢查哪個任務已完成,並且結果如何(true/false)。這很複雜。如果我有100個任務,我不能有100個條件。

var tasks = new[] {task1, task2, task3}; 

     var process = tasks.Select(async task => 
     { 
      var result = await task; 
      if(task == task1)assign property 

     }); 

     await Task.WhenAll(proces); 

編輯: 這裏是ValidateUriAsync FUNC:

public async Task<bool> ValidateUriAsync(Uri uri) 
    { 
     try 
     { 
      var request = WebRequest.CreateHttp(uri); 
      var result = await request.GetResponseAsync(); 
      return true; 
     } 
     catch (Exception e) 
     { 
      return false; 
     } 
    } 
+0

所有任務的結果是相同類型的嗎? – Default

+0

是的。 ValidateUriAsync返回true/false。 – JuP

+0

你能否展示一些你如何創建你的任務的摘錄(我猜你沒有100行代碼來執行'var task_n = await _co ... Async(uri_n)')? – Default

回答

2

當一些任務完成我需要爲每個任務的輸出結果。

不要在「完成任務時做出反應」的角度思考這個問題。相反,將您的ValidateUriAsync方法看作是「操作」,並且您想要創建一個新的更高級別的「操作」,即「驗證和分配」。

有了這種心態,解決的辦法是更清晰 - 引入新運營的新async方法:

private async Task ValidateAndOutputResult(Uri uri, string name) 
{ 
    var result = await _connectionService.ValidateUriAsync(uri); 
    OutputResult(name, result); 
} 

現在,您可以撥打更高級別的方法,並使用Task.WhenAll

var tasks = new[] 
{ 
    ValidateAndOutputResult(uri1, "ss"), 
    ValidateAndOutputResult(uri2, "bb"), 
    ValidateAndOutputResult(uri3, "cc"), 
}; 
await Task.WhenAll(tasks); 
+0

謝謝你的回答。是的,這是一種選擇。但是如果我需要綁定到屬性的結果而不是UI上的值顯示呢?我正在考慮在ValidateUriAsync方法中使用ref參數,但在await/async中不允許使用ref/out參數。 – JuP

+0

如果您的意思是每個URI都有* separate *屬性,那麼您可以將委託傳遞給'ValidateAndOutputResult'(例如,「Action '),以更新相應的屬性。 –

+0

謝謝Stephen,我會試試這個:) – JuP