C# Task WhenAll on 方法,该方法根据等待的调用返回结果

标签 c# .net asynchronous task

我试图让这段代码以异步方式工作,但我有一些疑问。

public async Task<string> GetAsync(string inputA, string inputB)
{
    var result = await AnotherGetAsync(inputA, inputB)
        .ConfigureAwait(false);

    return result.Enabled
        ? inputB
        : string.Empty;
}

我有一些字符串输入集合,我想在它们上运行这个方法。 然后我会执行 Task.WhenAll,并过滤非空字符串。

但它不会是异步的,因为我已经在等待结果了,对吗?

最佳答案

我认为真正的问题是:

If a single item is awaited inside method A, will this run sequential if I use Task.WhenAll for a range of items calling method A?

它们将与Task.WhenAll同时运行。 也许最好用一个例子来解释:

void Main()
{
    Test().GetAwaiter().GetResult();
}

private async Task<bool> CheckEmpty(string input)
{
    await Task.Delay(200);
    return String.IsNullOrEmpty(input);
}

private async Task Test()
{
    var list = new List<string>
    {
        "1",
        null,
        "2",
        ""
    };

    var stopwatch = new Stopwatch();
    stopwatch.Start();

    // This takes aprox 4 * 200ms == 800ms to complete.
    foreach (var itm in list)
    {
        Console.WriteLine(await CheckEmpty(itm));
    }

    Console.WriteLine(stopwatch.Elapsed);
    Console.WriteLine();
    stopwatch.Reset();
    stopwatch.Start();

    // This takes aprox 200ms to complete.
    var tasks = list.Select(itm => CheckEmpty(itm));
    var results = await Task.WhenAll(tasks); // Runs all at once.
    Console.WriteLine(String.Join(Environment.NewLine, results));
    Console.WriteLine(stopwatch.Elapsed);
}

我的测试结果:

False
True
False
True
00:00:00.8006182

False
True
False
True
00:00:00.2017568

关于C# Task WhenAll on 方法,该方法根据等待的调用返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59283334/

相关文章:

c# - FolderBrowserDialog C# SelectedPath 始终显示在底部

c# - 关注应用程序 - 与操作系统相关的问题?

c# - Visual Studio 2013 不发现单元测试

multithreading - Web 服务器中长时间运行的任务

c# - 如何正确使用Microsoft.Bcl.Async?

c# - 为什么我们在哈希算法中有一个额外的桶数组?

c# - DataGridView 数据绑定(bind)到 List<List<T>>

.net - 如何使.NET 5上的ASP.NET Core Web API在Azure上运行?

javascript - 异步 Jasmine 测试在操作之前不会调用 beforeEach()

c# - 在不发送重定向的情况下使用 Controller 和 Action?