可以使用 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) 相同?