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