Вызов основанных на задачах методов из ASMX
У меня есть недавний опыт, которым я хотел бы поделиться, который может быть полезен всем, кому приходится поддерживать устаревшую веб-службу ASMX, которую необходимо обновить для вызова методов на основе задач.
Недавно я обновлял проект ASP.NET 2.0, который включает в себя устаревшую веб-службу ASMX, до ASP.NET 4.5. В рамках обновления я представил интерфейс веб-API, обеспечивающий расширенную автоматизацию приложения. Сервис ASMX должен сосуществовать с новым API для обратной совместимости.
Одной из функций приложения является возможность запрашивать данные из внешних источников данных (историков промышленных предприятий, заказных веб-служб и т. Д.) От имени вызывающего абонента. В рамках обновления я переписал существенные части уровня доступа к данным для асинхронного запроса данных с использованием асинхронного шаблона на основе задач. Учитывая, что невозможно использовать aync / await в службе ASMX, я изменил методы ASMX, чтобы они блокировали вызовы асинхронных методов, то есть вызывали метод на основе задач, а затем использовали Task.WaitAll для блокировки потока до завершения задачи.
При вызове любого метода ASMX, который вызывал метод, возвращающий Task или Task <T> изнутри, я обнаружил, что время запроса всегда истекло. Когда я прошел по коду, я увидел, что асинхронный код успешно выполняется, но вызов Task.WaitAll так и не обнаружил, что задача выполнена.
Это вызвало большую головную боль: как сервис ASMX мог бы успешно сосуществовать с новыми возможностями асинхронного доступа к данным?