2016-07-31 226 views
1

我重写HandleRequirementAsync方法,因此我无法修改该方法的返回类型。但是,我在UserManager中调用了一个异步的方法,并且需要等待,因此我必须将此代码放在另一个方法中。如何在不使用C#的异步方法中调用异步方法.Result

 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的正确方式,还是我会在这里遇到一些问题,如果是的话,那么另一种方法可以解决这个问题呢?

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

+2

只是定义方法'保护覆盖异步任务HandleRequirementAsync'。在这里没有返回类型的变化,你可以使用'await' –

+0

也不需要'返回await Task.FromResult(true);''只需要返回true;' –

+0

@AlekseyL。谢谢你的提示。我最初尝试过,但它抱怨任务作为返回类型,并且想要任务出现此错误:\t因为'EducationArmHandler.HandleRequirementAsync(AuthorizationHandlerContext,EducationArmRequirement)'是一个返回'Task'的异步方法,所以不能跟随返回关键字由一个对象表达。你打算返回'任务'吗? \t然后,当更改为任务时,它不符合重写的方法类型,因此它说没有该类型的重载。 – Xaxum

回答

4

正如评论暗示,异步修改不改变方法签名 - 你可以添加此。您还可以简化去除的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; 
} 
+0

谢谢。我缺少的关键是if语句中的等待。我曾尝试过,但显然我在其他地方遇到了问题。再次感谢。 – Xaxum

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