Em C #, quando você substitui um método, é permitido fazer a substituição assíncrona quando o método original não era. Parece uma forma ruim.
O exemplo que me trouxe a isso foi o seguinte: fui chamado para ajudar com um problema de teste de carga. Em cerca de 500 usuários simultâneos, o processo de login seria interrompido em um loop de redirecionamento. O IIS registrava exceções com a mensagem "Um módulo ou manipulador assíncrono concluído enquanto uma operação assíncrona ainda estava pendente". Algumas pesquisas me levaram a pensar que alguém estava abusando async void
, mas minhas pesquisas rápidas na fonte não encontraram nada.
Infelizmente, eu estava procurando por 'async \ svoid' (pesquisa regex) quando deveria estar procurando algo mais como 'async \ s [^ T]' (assumindo que a tarefa não estava totalmente qualificada ... você entendeu).
O que eu encontrei mais tarde foi async override void onActionExecuting(...
em um controlador base. Claramente, esse tinha que ser o problema, e era. Corrigir isso (tornando-o síncrono no momento) resolveu o problema.
Voltando à pergunta: Por que, oh, por que você pode marcar uma substituição como assíncrona quando o código de chamada nunca poderia aguardá-la?
Task
.