DrG*_*iff 3 c# lambda asynchronous task-parallel-library async-await
我有以下方法在完成之前返回(方法为简洁而减少):
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并获取第一个"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.
    }
}
阅读如何在ForEach中使用Async?更多.
| 归档时间: | 
 | 
| 查看次数: | 896 次 | 
| 最近记录: |