2016-04-30 3 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 запросов, прежде чем я смогу проверить содержимое.

Я ищу способ сразу найти сценарий, в котором нет Интернета, и я возвращаю null, не дожидаясь 200 запросов.

+1

Ожидаете ли вы интернет падать вниз * во время выполнения задачи? * Или вы можете проверить на интернет непосредственно перед запуском задачи? –

+0

Сильно связано: http://stackoverflow.com/q/27238232 –

+0

Умм, я думаю, это могут быть оба варианта. Я просто пытаюсь поймать все ошибки, которые могут произойти. –

ответ

2

Для этого вам нужно

  1. CancellationTokenSource сигнализировать о том, что задание выполнено.
  2. Метод WhenAll из 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, но я думаю, что все еще есть ошибка. Если я не ошибаюсь, 'await classNameTasks.WhenAll (cts.Token);' будет вызывать 'AggregateException', содержащий' OperationCanceledException'; –

Смежные вопросы