Как правильно вызвать асинхронный метод C # при переопределении неасинхронного метода? - PullRequest
0 голосов
/ 24 мая 2019

Я создаю TagHelper для RazorPage.Единственное требование класса TagHelper - переопределение метода процесса.

Вот подпись (и спасибо за решение Стивен, давайте просто предположим, что ProcessAsync не существует, поэтому мы все еще можем ответить на вопрос).

public override void Process(TagHelperContext context, TagHelperOutput output)

Тело очень простое

if(_roleService.CanRegisterAsync().Result)
{
    output.SuppressOutput();
}

Я слышал, что взаимные блокировки могут быть вызваны вызовом .Результат асинхронных методов, поэтому я не хочу вызывать его, как написано выше, потому что кажется, что я могу столкнуться с некоторыми проблемами.

Итак, я изменяю виртуальное переопределение, добавляя async к

public override async void Process(TagHelperContext context, TagHelperOutput output)

, а тело к

if(await _roleService.CanRegisterAsync())
{
    output.SuppressOutput();
}

Это компилируется нормально, но output.SupressOutput () не делаетКажется, что больше не имеет никакого эффекта, поэтому я вынужден вернуться к исходному коду, который кажется плохой идеей.

Есть ли лучший способ справиться с этой ситуацией, чтобы я не столкнулся с тупиками, о которых многие говорят в других асинхронных сообщениях?

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Вам необходимо создать помощник по асинхронным тегам ;другими словами, переопределите ProcessAsync вместо Process.Таким образом, вы можете использовать await:

public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
  if(await _roleService.CanRegisterAsync())
  {
    output.SuppressOutput();
  }
  ...
}
0 голосов
/ 02 июня 2019

Очевидно, что вы ищете следующее:

if(_roleService.CanRegisterAsync().WaitAndUnwrapException())
{
    output.SuppressOutput();
}

Примечание : название метода настоятельно рекомендует использовать try/catch для обработки возможных исключений

...