2016-04-30 34 views
4

我有一個控制檯應用程序,我需要訪問一些URL 200次,等待所有請求返回並處理200個結果。在Enumerable.Range中訪問結果無需等待所有任務完成

我做到了這樣,在並行:

var classNameTasks = Enumerable.Range(1, 200).Select(i => webApi.getSplittedClassName()).ToArray(); 
string[][] splittedClassNames = await Task.WhenAll(classNameTasks); 
if (splittedClassNames[0] == null) 
    result = new TextResult("Error accessing the web"); 

getSplittedClassName返回string[],如果互聯網是關閉它會返回null

現在,您可以看到,在完成所有任務後,我會執行如果檢查內容,如果它的網絡問題是null

這裏的問題是,我需要等待整個200請求返回,然後才能檢查內容。

我正在尋找一種方法來立即檢測沒有互聯網的場景,並且我無需等待200個請求就返回null。

+1

的WhenAll方法你期望互聯網在任務執行過程中摔倒*?*或者你可以在開始任務之前,爲了檢查互聯網? –

+0

強烈的相關:http://stackoverflow.com/q/27238232 –

+0

嗯,我想這可能是兩個選項。我只是想抓住所有可能發生的錯誤 –

回答

2

要做到這一點,你需要

  1. 一個CancellationTokenSource信號的工作已經完成。
  2. Tortuga.Anchor

    static async Task Test() 
    { 
        TextResult result; 
    
        var cts = new CancellationTokenSource(); 
    
        var classNameTasks = Enumerable.Range(1, 200).Select(i => getSplittedClassName(cts)).ToArray(); 
        await classNameTasks.WhenAll(cts.Token); 
        if (cts.IsCancellationRequested) 
         result = new TextResult("Error accessing the web"); 
    
        string[][] splittedClassNames = classNameTasks.Select(t => t.Result).ToArray(); 
    
    } 
    
    private static async Task<string[]> getSplittedClassName(CancellationTokenSource cts) 
    { 
        try 
        { 
         //real code goes here 
         await Task.Delay(1000, cts.Token); //the token would be passed to the real web method 
         return new string[0]; 
        } 
        catch 
        { 
         cts.Cancel(); //stop trying 
         return null; 
        } 
    } 
    
+0

這是正確的方法,雖然它會更加正確(或者與OP一致) )如果不是try/catch塊,在空值響應(而不是異常)情況下取消標記 –

+0

我將返回固定爲null,但我認爲仍然存在一個錯誤。如果我沒有弄錯,「等待classNameTasks.WhenAll(cts.Token);'將拋出一個包含'OperationCanceledException'的AggregateException; –