这个 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);
}
我有以下代码(为简洁起见更改了我的 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);
}