C# C使用异步lambda表达式,并在可枚举的.All扩展中返回bool

C# C使用异步lambda表达式,并在可枚举的.All扩展中返回bool,c#,lambda,async-await,C#,Lambda,Async Await,我有以下异步方法 但是上面的代码得到以下错误 错误CS4010无法将异步lambda表达式转换为委托类型“Func”。异步lambda表达式可能返回void、Task或Task,它们都不能转换为“Func” 一种方法是投影到IEnumerable 这种方法的问题在于,您可能会不必要地处理所有项目。Michael Randall的回答会产生正确的逻辑结果,但必须评估所有策略,即使在这两种情况下,评估都可能会因第一个错误结果而短路,或者第一个正确结果会短路 通过将任务转换为IAsyncenumera

我有以下异步方法

但是上面的代码得到以下错误

错误CS4010无法将异步lambda表达式转换为委托类型“Func”。异步lambda表达式可能返回void、Task或Task,它们都不能转换为“Func”

一种方法是投影到IEnumerable


这种方法的问题在于,您可能会不必要地处理所有项目。

Michael Randall的回答会产生正确的逻辑结果,但必须评估所有策略,即使在这两种情况下,评估都可能会因第一个错误结果而短路,或者第一个正确结果会短路

通过将任务转换为IAsyncenumerable并使用以下方法可以避免此问题:


你想同时还是按顺序运行这些任务?@TheodorZoulias,我认为在任何情况下都应该按顺序运行,而在所有情况下都可以concurrently@JohnathanBarclay感谢您的编辑,这是在我的手机上完成的:P@MichaelRandall没问题:@MichaelRandall,那么var result=IsAndPolicy呢?policys.Allx=>HasPolicycontext,x.Result:policys.Anyx=>HasPolicycontext,x.Result?我希望这种方法能够以某种方式使用异步编写/await@roroinpho21虽然那会有用。。。非常可疑的是,您正在按顺序执行所有操作,而不是从异步和等待模式生成IAsyncStateMachine,而且相当难闻。Panagiotis Kanavos在这里真的有最好的方法FWIW,如果你能打电话的话ToAsyncEnumerable@roroinpho21当心Task.Result属性。仅将其用于已知已完成的任务是可以的。否则修正了我的名字,因为这是一个令人敬畏的回答。我真的需要glasses@PanagiotisKanavos似乎resultTasks.AllAsyncx=>x All不存在,但不工作,参数不正确。错误CS0029无法将类型“System.Threading.Tasks.Task”隐式转换为“bool”。System.Linq.Async库不包含扩展方法All和Any。至少不是我当前安装的版本4.1.1。它包含AllAsync、AllAwaitAsync和AllAwaitWithCancellationAsync方法,并且对任何一个方法都包含相同的集合。在这种情况下,XXXAwaitAsync变体可能是最合适的。您还需要提供async await lambdas,以便从Task转换为ValueTask:resultTasks.AllawaitAsync x=>await x等@TheodorZoulias这是AllAsync和AnySync,不需要在其中提供await。您正在查看我使用的Github源代码。如果您检查单元测试,您将看到操作不需要等待。问题是由返回IAsyncEnumerable的Select创建的
private async Task<bool> HasPolicy(AuthorizationFilterContext context, string policy)
{
    var authorized = await _authorization.AuthorizeAsync(context.HttpContext.User, policy);
    return authorized.Succeeded;
}
var result1 = IsAndPolicy
    ? policys.All(async x => await HasPolicy(context, x))
    : policys.Any(async x => await HasPolicy(context, x));
var results = await Task.WhenAll(policys.Select(x => HasPolicy(context, x)));

var result1 = IsAndPolicy 
   ? results.All(x => x)                
   : results.Any(x => x);
var resultTasks=policies.ToAsyncEnumerable()
                        .Select(async x => await HasPolicy(context, x));

var result1 = await (IsAndPolicy 
                       ? resultTasks.AllAsync(x => x)                
                       : resultTasks.AnyAsync(x => x));