覆盖非异步方法时如何正确调用C#异步方法?

时间:2019-05-24 18:07:53

标签: c# asynchronous razor-pages asp.net-core-tag-helpers

我正在为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()似乎不再起作用,因此我被迫回到原始代码,这似乎是个坏主意。

有没有更好的方法来处理这种情况,这样我就不会像其他人在其他异步帖子中所说的那样陷入僵局?

2 个答案:

答案 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处理可能的异常