不等待 lambda foreach 中的异步调用
Async call within a lambda foreach is not awaited
我有以下 returns 完成之前的方法(为简洁起见删减的方法):
private void ProcessAllItems(List<Item> items)
{
items.ForEach(async item =>
{
var response = await Processor.IOBoundTaskAsync(item);
// Some further processing on the response object.
});
}
Processor.IOBoundTaskAsync 方法 returns 一个 Task,所以不是 void。
所以,这是怎么回事?
我希望 lambda foreach 一次处理每一项,因此不是并行处理。对于第一次迭代,代码进入 IOBoundTaskAsync 并到达第一个 "await"(它调用 4 个等待的 Web 服务方法中的第一个),然后调用方法 "ProcessAllItems" 退出。
我只使用测试数据,所以我的列表中只有 1 个项目。
我错过了什么?
List<T>.ForEach
将您的异步 lambda 转换为 async void
,因为它接受 Action<T>
。尽管它这样做并且在异常处理方面有一些复杂性,但您的 ForEach
调用应该可以正常工作。如果不是,您可能没有正确使用异步模式。我建议您在第一个 await
之后设置一个断点并查看继续执行。
我建议您改用常规 foreach
:
private async Task ProcessAllItemsAsync(List<Item> items)
{
foreach (var item in items)
{
var response = await Processor.IOBoundTaskAsync(item);
// Some further processing on the response object.
}
}
阅读 How can I use Async with ForEach? 了解更多。
我有以下 returns 完成之前的方法(为简洁起见删减的方法):
private void ProcessAllItems(List<Item> items)
{
items.ForEach(async item =>
{
var response = await Processor.IOBoundTaskAsync(item);
// Some further processing on the response object.
});
}
Processor.IOBoundTaskAsync 方法 returns 一个 Task
所以,这是怎么回事?
我希望 lambda foreach 一次处理每一项,因此不是并行处理。对于第一次迭代,代码进入 IOBoundTaskAsync 并到达第一个 "await"(它调用 4 个等待的 Web 服务方法中的第一个),然后调用方法 "ProcessAllItems" 退出。
我只使用测试数据,所以我的列表中只有 1 个项目。
我错过了什么?
List<T>.ForEach
将您的异步 lambda 转换为 async void
,因为它接受 Action<T>
。尽管它这样做并且在异常处理方面有一些复杂性,但您的 ForEach
调用应该可以正常工作。如果不是,您可能没有正确使用异步模式。我建议您在第一个 await
之后设置一个断点并查看继续执行。
我建议您改用常规 foreach
:
private async Task ProcessAllItemsAsync(List<Item> items)
{
foreach (var item in items)
{
var response = await Processor.IOBoundTaskAsync(item);
// Some further processing on the response object.
}
}
阅读 How can I use Async with ForEach? 了解更多。