gpt4 book ai didi

c# - 在不使用 .Result 的情况下如何在 C# 中不能异步的方法中调用异步方法

转载 作者:太空狗 更新时间:2023-10-30 00:38:45 25 4
gpt4 key购买 nike

我正在覆盖一个方法 HandleRequirementAsync,因此我无法修改该方法的返回类型。但是,我在 UserManager 中调用一个方法,该方法是异步的并且需要等待,所以我不得不将这段代码放在另一个方法中。

        protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
EducationArmRequirement requirement)
{

if (!IsEducationGroup(context).Result)
{
return Task.FromResult(0);
}


context.Succeed(requirement);

return Task.FromResult(0);
}

protected async Task<bool> IsEducationGroup(AuthorizationHandlerContext context)
{
var userId = context.User.Identity.Name;
ApplicationUser u = await _userManager.FindByNameAsync(userId);
if (u.Group == 3 || u.Group == 4)
{
return await Task.FromResult(true);
}
return await Task.FromResult(false);
}

上面的代码似乎在测试中有效,但它使用 .Result 来解包任务以获取 bool 值。我看到有几个地方说要小心使用结果。我看到这个 question它试图解释原因,但我不明白。

我不能在 HandleRequirementAsync 方法中放置一个 await 以允许它正常解开,因为那样我将不得不修改返回类型,而我不能为这个被覆盖的方法做这件事。

我是否以正确的方式使用 .Result 来解决这个问题,或者我是否会在这里遇到一些问题,如果是的话,还有什么方法可以解决这个问题?

任何帮助/解释将不胜感激。

最佳答案

正如评论中所暗示的那样,async 修饰符不会更改方法签名 - 您只需添加它即可。您还可以简化以删除两种方法中 Task.FromResult 的使用:

protected override async Task HandleRequirementAsync(
AuthorizationHandlerContext context,
EducationArmRequirement requirement)
{
if (await IsEducationGroup(context))
{
context.Succeed(requirement);
}
}

protected async Task<bool> IsEducationGroup(AuthorizationHandlerContext context)
{
var userId = context.User.Identity.Name;

ApplicationUser u = await _userManager.FindByNameAsync(userId);

return u.Group == 3 || u.Group == 4;
}

关于c# - 在不使用 .Result 的情况下如何在 C# 中不能异步的方法中调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38681091/

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