gpt4 book ai didi

c# - Lambda 表达式 where 子句中的异步等待

转载 作者:太空狗 更新时间:2023-10-29 17:45:46 26 4
gpt4 key购买 nike

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

例如 -

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

异步方法看起来像

public async Task<bool> AsyncMethodCall(Data d){...}

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

Error CS4010 Cannot convert async lambda expression to delegate type 'Func<Data, bool>'. An async lambda expression may return void, Task or Task<T>, none of which are convertible to '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 的顺序生成它们完成。

关于c# - Lambda 表达式 where 子句中的异步等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43917157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com