[英]Async Await in Lambda expression where clause
我想在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>'
。
在此先感谢您的帮助
异步序列很棘手,因为你真的必须考虑你希望代码具体做什么。
例如,您可能希望按顺序执行AsyncMethodCall
调用,然后返回所有结果:
var result = new List<T>();
foreach (var d in xyz)
if (await AsyncMethodCall(d.val))
result.Add(d);
return result;
或者,您可以同时执行所有AsyncMethodCall
调用,然后收集并返回结果(同样,一次全部):
var tasks = xyz.Select(async d => new { d, filter = await AsyncMethodCall(d.val) });
var results = await Task.WhenAll(tasks);
return results.Where(x => x.filter).Select(x => x.d);
或者,您可以按顺序执行所有AsyncMethodCall
调用,并一次生成一个结果。 此方法与IEnumerable<T>
不兼容(假设您希望保持调用异步)。 如果要生成在序列枚举期间异步调用AsyncMethodCall
序列,则需要更改为IAsyncEnumerable<T>
。 如果要生成由使用者启动的序列,然后自己生成结果,则需要更改为IObservable<T>
。
或者,您可以同时执行所有AsyncMethodCall
调用,并一次生成一个结果。 这也与IEnumerable<T>
不兼容; 你需要改成IObservable<T>
。 而且您还需要决定是保持原始顺序,还是按AsyncMethodCall
完成顺序生成它们。
你在做什么是行不通的。 从错误消息中可以清楚地看出原因:
错误CS4010无法将异步lambda表达式转换为委托类型'Func'。 异步lambda表达式可能返回void,Task或Task,其中任何一个都不能转换为'Func'。
你有一个lambda表达式吐出Task<bool>
。 Where()
函数需要一个Function委托。 您无法将Task转换为可用于获取bool
的Function委托。 故事结局。
如果你真的想以这种方式调用方法,你需要确保lambda返回一个bool,在这种情况下,是调用async方法的结果:
return xyz.Where(x => AsyncMethodCall(x.val).Result);
这将起作用并为您提供有意义的结果,因为调用Result访问器将阻塞该线程,直到方法调用完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.