如果在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还是我会在这里遇到一些问题?如果是,还有什么方法可以解决这个问题?
如有任何帮助/解释,我们将不胜感激。
正如注释中所暗示的,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;
}