c# – 无需等待所有任务完成即可访问Enumerable.Range中的结果

我有一个控制台应用程序,我需要访问一些网址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返回一个字符串[],如果互联网关闭,它将返回null.

现在,正如您所看到的,在完成所有任务后,我会检查内容,如果其为null – >互联网问题.

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

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

最佳答案 要做到这一点,你需要

> CancellationTokenSource表示作业已完成.
> 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;
    }
}
点赞