Chamando métodos baseados em tarefas do ASMX
Tenho uma experiência recente que gostaria de compartilhar que pode ser útil para qualquer pessoa que precise manter um serviço da Web ASMX herdado que deve ser atualizado para chamar métodos baseados em tarefas.
Recentemente, atualizei um projeto do ASP.NET 2.0 que inclui um serviço da Web ASMX herdado para o ASP.NET 4.5. Como parte da atualização, apresentei uma interface de API da Web para permitir a automação avançada do aplicativo. O serviço ASMX deve coexistir com a nova API para compatibilidade com versões anteriores.
Uma das funções do aplicativo é poder solicitar dados de fontes de dados externas (historiadores de instalações industriais, serviços da web sob medida etc.) em nome do chamador. Como parte da atualização, reescrevi partes substanciais da camada de acesso a dados para solicitar dados de forma assíncrona usando um padrão assíncrono baseado em tarefas. Como não é possível usar aync / waitit em um serviço ASMX, modifiquei os métodos ASMX para fazer chamadas de bloqueio para os métodos assíncronos, ou seja, chamando o método baseado em tarefas e, em seguida, usando Task.WaitAll para bloquear o segmento até que a tarefa seja concluída.
Ao chamar qualquer método ASMX que estivesse chamando um método retornando Tarefa ou Tarefa <T>, descobri que a solicitação sempre expirava. Quando percorri o código, pude ver que o código assíncrono estava sendo executado com êxito, mas a chamada para Task.WaitAll nunca detectou que a tarefa havia sido concluída.
Isso causou uma grande dor de cabeça: como o serviço ASMX coexistia felizmente com os novos recursos de acesso a dados assíncronos?