当前位置: 首页 > 编程语言 > C#

在IEnumerable.Select中调用异步方法Share

时间:2023-04-10 21:50:11 C#

在IEnumerable.Select中调用异步方法列出remoteItems){...列出mappedItems=newList();foreach(varremoteIteminremoteItems){mappedItems.Add(awaitMapToLocalObject(remoteItem));}//用映射项做事...}privateasyncTaskMapToLocalObject(RremoteObject);是否可以使用IEnumerable.Select调用(或类似调用)来减少代码行数?我试过这个:classMyClass{publicasyncTaskMyMethodAsync(ListremoteItems){...//用映射的项目做事。..}}但我收到错误消息:“无法将异步lambda表达式转换为委托类型‘System.Func’。异步lambda表达式可能返回void、Task或Task,它们都不能转换为‘System.Func’.'我相信我遗漏了一些关于async/await关键字的东西,但我不知道是什么。有谁知道如何修改我的代码以使其工作?您可以通过考虑游戏中的类型来解决这个问题。例如,MapToLocalObject-当被视为异步函数时-从R映射到L但如果它被视为同步函数,它会从R映射到Task。Task是一个“未来”,因此将Task视为产生的类型L在未来的某个时刻。因此,您可以轻松地将R序列转换为任务序列:IEnumerable>mappingTasks=remoteItems.Select(remoteItem=>MapToLocalObject(remoteItem));请注意,此代码与原始代码之间存在重要的语义差异。您的原始代码在移动到下一个对象之前等待每个对象被映射;此代码将同时启动所有映射。您的结果是一系列任务-未来L个结果的序列。要使用任务序列,有一些常见的操作。Task.WhenAll和Task.WhenAny是满足最常见需求的内置操作。如果你想等到所有映射都完成,你可以这样做:L[]mappedItems=awaitTask.WhenAll(mappingTasks);如果你想在完成时处理每个项目,你可以使用我的AsyncEx库中的OrderByCompletion:以上是C#学习教程:调用IEnumerable.Select中的异步方法共享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——Task[]orderedMappingTasks=mappingTasks.OrderByCompletion();foreach(vartaskinorderedMappingTasks){varmappedItem=awaittask;...}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: