Реализовать синхронный код в IActionResult.ExecuteResultAsync()

#c# #.net #asp.net-core #.net-core

#c# #.net #asp.net-ядро #.net-ядро

Вопрос:

Я не знаю, может ли кто-нибудь помочь мне лучше понять это.

Я пишу класс, который реализует IActionResult . Для этого требуется, чтобы мой класс реализовал следующий метод.

 Task ExecuteResultAsync(ActionContext context);
  

В моем случае для реализации этого метода необходимо записать XML, используя XmlWriter to context.HttpContext.Response.Body .

Проблема в том, что я не думаю, что мне нужно запускать асинхронно здесь. (Я не знаю, является ли context.HttpContext.Response.Body это просто потоком памяти. Если это так, я определенно не вижу причин для асинхронного запуска.)

Итак, мои варианты:

  1. Используйте асинхронные версии методов XML.

    • Это кажется ненужным и, как будто это действительно может снизить производительность со всеми ненужными await s.

    • По какой-то причине асинхронные методы имеют совершенно разные аргументы, и я даже не уверен, что это такое.

  2. Используйте что-то вроде Task.RunSynchronously() .

    • Влияет ли это на производительность?

    • Нужна ли мне специальная обработка для каких-либо исключений?

Комментарии:

1. Спасибо за редактирование (по какой-то причине я не могу отправить вам сообщение под ответом), но взгляните на эту проблему , особенно прочитав этот комментарий .

Ответ №1:

ActionResult является абстрактным, но определяет public virtual void ExecuteResult(ActionContext context) , что вы можете переопределить, в дополнение к наследованию IActionResult .

Также обратите внимание, что ActionResult реализует IActionResult . И исходный код для ActionResult находится в Сети, так что вы даже можете увидеть, как ActionResult решить эту проблему, создав синхронный метод, который реализует IActionResult.ExecuteResult() .

Обновить:

К сожалению, запись XML с использованием XmlWriter to context.HttpContext.Response.Body вызывает исключение:

Система.Исключение InvalidOperationException: «Синхронные операции запрещены. Вместо этого вызовите WriteAsync или установите для AllowSynchronousIO значение true .’

Это остается проблемой.