Xax*_*xum 4 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);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码似乎在测试中工作,但它使用.Result解包任务以获得bool.我看过几个地方都说要小心使用结果.我看到这个问题试图解释为什么,但我没有得到它.
我不能在HandleRequirementAsync方法中等待允许它正常取消,因为那时我将不得不修改我不能为这个重写方法做的返回类型.
我是否接近使用.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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1874 次 |
| 最近记录: |