繁体   English   中英

Async Await在Lambda表达式where子句中

[英]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表达式可能返回voidTaskTask<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM