我重写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的正确方式,还是我会在这里遇到一些问题,如果是的话,那么另一种方法可以解决这个问题呢?
任何帮助/解释将不胜感激。
只是定义方法'保护覆盖异步任务HandleRequirementAsync'。在这里没有返回类型的变化,你可以使用'await' –
也不需要'返回await Task.FromResult(true);''只需要返回true;' –
@AlekseyL。谢谢你的提示。我最初尝试过,但它抱怨任务作为返回类型,并且想要任务出现此错误:\t因为'EducationArmHandler.HandleRequirementAsync(AuthorizationHandlerContext,EducationArmRequirement)'是一个返回'Task'的异步方法,所以不能跟随返回关键字由一个对象表达。你打算返回'任务'吗? \t然后,当更改为任务时,它不符合重写的方法类型,因此它说没有该类型的重载。 –
Xaxum