可以使用 Task.WhenAll(...) 或其他比每次等待更有意义的东西重写此异步/等待代码吗? [复制]

Posted

技术标签:

【中文标题】可以使用 Task.WhenAll(...) 或其他比每次等待更有意义的东西重写此异步/等待代码吗? [复制]【英文标题】:Can this async/await code be rewritten using Task.WhenAll(...) or something else that makes more sense then awaiting each time? [duplicate] 【发布时间】:2015-07-15 13:05:22 【问题描述】:

我有以下代码(为简洁起见,更改了我的类/对象的名称)。它本质上是在访问一个只允许单个操作的外部 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);
   

【问题讨论】:

【参考方案1】:

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

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);

【讨论】:

这正是我要找的乔恩!感谢您的帮助。

以上是关于可以使用 Task.WhenAll(...) 或其他比每次等待更有意义的东西重写此异步/等待代码吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Task.WhenAll 一次向我的 WebAPI 发送多个请求

从 Task.WhenAll 调用的异步方法使用 DbContext 并返回错误

Task CancellationTokenSource和Task.WhenAll的应用

csharp Task.WhenAllを利用している场合のタイムアウト处理の书き方(Task.WhenAll,Task.WhenAny,Task.Delay)

Task.WhenAll(taskList).Wait() 是不是与 Task.WaitAll(taskList) 相同?

异步/等待死锁 Task.WaitAll 与 Task.WhenAll [重复]