我想在lambda表达式中调用一个异步方法。请帮我做以下

例如-

return xyz.Where(async x=> await AsyncMethodCall(x.val));

和异步方法看起来像
public async Task<bool> AsyncMethodCall(Data d){...}

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



先谢谢您的帮助

最佳答案

异步序列很棘手,因为您确实必须考虑想让代码做什么。

例如,您可能想顺序执行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完成的顺序生成它们。

10-06 13:39