这个 async/await 代码可以使用 Task.WhenAll(...) 或其他比每次都等待更有意义的东西重写吗?

Can this async/await code be rewritten using Task.WhenAll(...) or something else that makes more sense then awaiting each time?

我有以下代码(为简洁起见更改了我的 classes/objects 的名称)。它本质上是在触发一个只允许单个操作的外部 API,但我的服务代码会将其公开为 bulk 类型的请求。

等待每个异步请求似乎不对,而是分派所有请求并等待所有请求。不过我可能是错的。

public async void SendSeveralRequestsAsync(MyClass myClass)
{
   var client = SomeExternalServiceClient();

   foreach(var item in myClass)
   {
        var singleAsyncRequest = new ExternalServiceRequest()
        {
            Value = item.Value
        };

        var response = await client.SendAsync(singleAsyncRequest);
   }
}

是的,您应该可以使用类似的东西:

public async void SendSeveralRequestsAsync(MyClass myClass)
{
   var client = SomeExternalServiceClient();
   var tasks = myClass
       .Select(item => new ExternalServiceRequest { Value = item.Value })
       .Select(request => client.SendAsync(request));
   await Task.WhenAll(tasks);
}

或者甚至更好——因为我不喜欢从非事件的异步方法返回 void

public Task SendSeveralRequestsAsync(MyClass myClass)
{
   var client = SomeExternalServiceClient();
   var tasks = myClass
       .Select(item => new ExternalServiceRequest { Value = item.Value })
       .Select(request => client.SendAsync(request));
   return Task.WhenAll(tasks);
}