如何在不使用.Result

时间:2016-07-31 05:37:07

标签: c# async-await asp.net-core

我重写了一个方法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方法中等待允许它正常取消,因为那时我将不得不修改我不能为这个重写方法做的返回类型。

我是否接近使用.Result的正确方法,或者我是否会在这里遇到一些问题,如果是这样,另一种方法是什么呢?

非常感谢任何帮助/解释。

2 个答案:

答案 0 :(得分:5)

正如评论中暗示的那样,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;
}

答案 1 :(得分:0)

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;
        }