2017-06-29 44 views
0

假設我有更多的Uri。我需要驗證,如果他們是可及的。使用WebRequest運行Uri的並行驗證

public RelayCommand TestConnectionCommand => new RelayCommand(async() => 
    { 
     var res1 = await ValidateUriAsync(uri); 
     var res2 = await ValidateUriAsync(uri); 


    }); 

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

當程序涉及到第一等待它需要一些時間來驗證URI後,我得到的結果,我可以顯示在搜索結果。然後程序接下來,我驗證第二個uri。我希望能夠平行進行,無需等待。我正在考慮使用Begin/EndGetResponse。我需要在View上顯示每個驗證的結果。驗證成功/失敗。

非常感謝您的建議。

回答

3

當使用等待着你停止執行,直到任務回報,而不是等待所有任務完成:

var task1 = ValidateUriAsync(uri); 
var task2 = ValidateUriAsync(uri); 

await Task.WhenAll(task1, task2); 

還是要等到第一個故障:

var tasks = new List<Task> 
{ 
    ValidateUriAsync(), ValidateUriAsync(uri) 
}; 

while (tasks.Any()) 
{ 
    var t = await Task.WhenAny(tasks); 

    if (t.IsFaulted) 
    { 
     //Faulty 
     break; 
    } 

    tasks.Remove(t); 
} 
+0

我知道這件事。但是當任何任務拋出異常時,結果將會是Faulted。 – JuP

+0

如果WhenAll的結果有問題,那麼您需要通過您的任務來查看哪一個(或多個)導致故障。 – Chrille

+0

但是使用WhenAll必須等待所有任務完成時。然後我可以遍歷所有任務並檢查成功或失敗。如果第一次驗證需要15秒,第二次驗證2秒會怎麼樣?我將等待15秒以顯示驗證結果。我需要立即顯示結果。 – JuP