如果在C#中不使用.Result就不能异步,那么如何在方法中调用异步方法呢

本文关键字:方法 异步方法 调用 异步 Result 如果 就不能 | 更新日期: 2023-09-27 17:59:17

我正在重写一个方法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);
        }

上面的代码似乎在测试中有效,但它使用.Resort来打开Task以获得bool。我见过几个地方说要小心使用结果。我看到了这个问题,试图解释为什么,但我不明白。

我不能在HandleRequirementAsync方法中放入wait以允许它正常展开,因为那样我就必须修改返回类型,而我不能为这个重写的方法做这件事。

我是用正确的方式来处理这个问题。Result还是我会在这里遇到一些问题?如果是,还有什么方法可以解决这个问题?

如有任何帮助/解释,我们将不胜感激。

如果在C#中不使用.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;
}

IsEducationGroup组函数

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

HandleRequirementAsync函数

protected override async Task HandleRequirementAsync(
          AuthorizationHandlerContext context,
          EducationArmRequirement requirement)
        {
           var result =  await (!IsEducationGroup(context));
            if(!result)
                return;

            context.Succeed(requirement);
            return;
        }