C# TaskWhenAll on 方法根据等待的调用返回结果

pas*_*ski 5 .net c# 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;
}
Run Code Online (Sandbox Code Playgroud)

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

但它不会像我已经在等待结果的方法内部那样异步,对吗?

Sil*_*ind 2

我认为真正的问题是:

如果在方法 A 内等待单个项目,如果我将其用于Task.WhenAll调用方法 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);
}
Run Code Online (Sandbox Code Playgroud)

我的测试结果:

False
True
False
True
00:00:00.8006182

False
True
False
True
00:00:00.2017568
Run Code Online (Sandbox Code Playgroud)