Async Await在Lambda表达式where子句中

San*_*ndy 9 .net c# linq lambda asynchronous

我想在lambda表达式中调用异步方法.请帮我做下面的事情

例如 -

return xyz.Where(async x=> await AsyncMethodCall(x.val));
Run Code Online (Sandbox Code Playgroud)

Async方法看起来像

public async Task<bool> AsyncMethodCall(Data d){...}
Run Code Online (Sandbox Code Playgroud)

当我执行上述操作时,出现以下错误

错误CS4010无法将异步lambda表达式转换为委托类型 'Func<Data, bool>'.异步lambda表达式可能会返回void,Task 或者Task<T>没有一个可以转换为'Func<Data, bool>'.

在此先感谢您的帮助

Ste*_*ary 12

异步序列很棘手,因为你真的必须考虑你希望代码具体做什么.

例如,您可能希望AsyncMethodCall按顺序执行调用,然后返回所有结果:

var result = new List<T>();
foreach (var d in xyz)
  if (await AsyncMethodCall(d.val))
    result.Add(d);
return result;
Run Code Online (Sandbox Code Playgroud)

或者,您可以同时执行所有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);
Run Code Online (Sandbox Code Playgroud)

或者,您可以AsyncMethodCall按顺序执行所有调用,并一次生成一个结果.这种方法与IEnumerable<T>(假设您希望保持调用异步)不兼容.如果要生成AsyncMethodCall在序列枚举期间异步调用的序列,则需要更改为IAsyncEnumerable<T>.如果要生成由使用者启动的序列,然后自己生成结果,则需要更改为IObservable<T>.

或者,您可以同时执行所有AsyncMethodCall调用,并一次生成一个结果.这也与...不相容IEnumerable<T>; 你需要换到IObservable<T>.而且您还需要决定是保持原始排序,还是按照AsyncMethodCall完成顺序生成它们.