我正在为RazorPage创建TagHelper。 TagHelper
类的唯一要求是覆盖处理方法。
这里是签名(感谢您的解决方案,斯蒂芬让我们假设ProcessAsync不存在,所以我们仍然可以回答问题)。
public override void Process(TagHelperContext context, TagHelperOutput output)
身体很简单
if(_roleService.CanRegisterAsync().Result)
{
output.SuppressOutput();
}
我听说在异步方法上调用.Result可能导致死锁,所以我不想像上面写的那样调用它,因为看来我可能会遇到一些麻烦。
因此,我通过向
添加异步来更改虚拟覆盖public override async void Process(TagHelperContext context, TagHelperOutput output)
和身体
if(await _roleService.CanRegisterAsync())
{
output.SuppressOutput();
}
这可以正常编译,但是output.SupressOutput()似乎不再起作用,因此我被迫回到原始代码,这似乎是个坏主意。
有没有更好的方法来处理这种情况,这样我就不会像其他人在其他异步帖子中所说的那样陷入僵局?
答案 0 :(得分:2)
您需要创建一个asynchronous tag helper;换句话说,请覆盖ProcessAsync
而不是Process
。这样,您可以使用await
:
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
if(await _roleService.CanRegisterAsync())
{
output.SuppressOutput();
}
...
}
答案 1 :(得分:0)
显然,您所追求的是:
if(_roleService.CanRegisterAsync().WaitAndUnwrapException())
{
output.SuppressOutput();
}
备注:该方法的名称强烈建议使用try/catch
处理可能的异常