我有以下方法在完成之前返回(为简便起见,方法已减少):
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 <SomeResponseObject>,因此不会返回void。
那么,发生了什么事?
我希望lambda foreach一次处理每个项目,所以不要并行处理。对于第一次迭代,代码进入IOBoundTaskAsync并到达第一个“等待”(在其中调用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.
}
}
阅读如何在ForEach中使用异步?更多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句