gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:23:25 24 4
gpt4 key购买 nike

我有一个控制台应用程序,我需要访问某个 url 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. 一个 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;
    }
    }

关于c# - 无需等待所有任务完成即可访问 Enumerable.Range 中的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36958938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com