无需等待所有任务完成即可访问Enumerable.Range

时间:2016-04-30 18:58:05

标签: c# asynchronous async-await range ienumerable

我有一个控制台应用,我需要访问一些网址200次,等待所有返回的请求并处理200个结果。

我这样做,并行:

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

现在,正如您所看到的,在完成所有任务后,我会执行 if 来检查内容,如果是null - >互联网问题。

这里的问题是我需要等待整个200个请求返回才能检查内容。

我正在寻找一种方法来立即检测出没有互联网的情况,并且我返回null,而不必等待200个请求。

1 个答案:

答案 0 :(得分:2)

要做到这一点,你需要

  1. CancellationTokenSource表示作业已完成。
  2. Tortuga.Anchor

    中的WhenAll方法
    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;
        }
    }