En C #, cuando anula un método, se permite hacer que la anulación sea asíncrona cuando el método original no lo estaba. Esto parece una forma pobre.
El ejemplo que me llevó a esto fue este: me llevaron para ayudar con un problema de prueba de carga. Con alrededor de 500 usuarios concurrentes, el proceso de inicio de sesión se rompería en un bucle de redireccionamiento. IIS estaba registrando excepciones con el mensaje "Un módulo o controlador asíncrono completado mientras una operación asincrónica aún estaba pendiente". Algunas búsquedas me llevaron a pensar que alguien estaba abusando async void
, pero mis búsquedas rápidas a través de la fuente no pudieron encontrar nada.
Lamentablemente, estaba buscando 'async \ svoid' (búsqueda de expresiones regulares) cuando debería haber estado buscando algo más como 'async \ s [^ T]' (suponiendo que la Tarea no estaba completamente calificada ... entiendes el punto).
Lo que más tarde encontré fue async override void onActionExecuting(...
en un controlador base. Claramente ese tenía que ser el problema, y lo era. Arreglar eso (haciéndolo sincrónico por el momento) resolvió el problema.
Volver a la pregunta: ¿Por qué, oh, por qué puede marcar una anulación como asíncrona cuando el código de llamada nunca podría esperarla?
Task
.