我有以下方法在完成之前返回(方法为了简洁而减少):
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方法返回一个Task&lt; SomeResponseObject&gt;,因此不是一个空格。
那么,发生了什么?
我希望lambda foreach一次处理一个项目,所以不是并行。对于第一次迭代,代码进入IOBoundTaskAsync并获得第一次&#34; await&#34; (它调用4个等待的Web服务方法中的第一个)然后调用方法&#34; ProcessAllItems&#34;退出。
我只使用测试数据,因此我的列表中只有1个项目。
我错过了什么?
答案 0 :(得分:8)
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?了解更多信息。