【发布时间】:2017-10-10 13:25:09
【问题描述】:
我想在 lambda 表达式中调用一个异步方法。请帮我做以下事情
例如 -
return xyz.Where(async x=> await AsyncMethodCall(x.val));
Async 方法看起来像
public async Task<bool> AsyncMethodCall(Data d){...}
当我执行上述操作时,我收到以下错误
错误 CS4010 无法将异步 lambda 表达式转换为委托类型
'Func<Data, bool>'。异步 lambda 表达式可能返回void、Task或Task<T>,都不能转换为'Func<Data, bool>'。
提前感谢您的帮助
【问题讨论】:
-
过滤器在哪里。它应该 filter 事物,而不是进行随机更改。为什么要在其中使用异步方法?您是否像使用 Select 语句一样使用它?
-
@PanagiotisKanavos 例如,它可以调用 Web 服务,或访问数据库......问题很好......你不能这样做,即使你可以也可能不会是个好主意,但这是另一个问题......
-
@xanatos 事实上这是一个坏主意,这可能是你不能这样做的原因,即为什么没有接受任务的
Where()方法 -
一般
async和IEnumerable<>不要混用,因为Task(async基础的类)预设了它包含的结果只有当它是Completed... 但是在这里你可以在Task的生命周期“期间”枚举结果的各个部分(单个xyz元素),而Task是Completed,当有没有更多元素。 -
您的
async和await相互抵消。相同但更简单:.Where(x => AsyncMethodCall(x.val))。这应该会给你同样的错误,Where()扩展方法不接受等待。
标签: c# .net linq asynchronous lambda