En C #, cuando reemplaza un método, está permitido hacer que el reemplazo sea asíncrono cuando el método original no lo era. Esto parece ser una mala forma.
El ejemplo que me llevó a esto fue el siguiente: me trajeron para ayudar con un problema de prueba de carga. En alrededor de 500 usuarios simultáneos, el proceso de inicio de sesión se rompería en un bucle de redirección. IIS estaba registrando excepciones con el mensaje "Un módulo o controlador asíncrono se completó mientras una operación asincrónica aún estaba pendiente". Algunas búsquedas me llevaron a pensar que alguien estaba abusando de async void
, pero mis búsquedas rápidas en 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]' (asumiendo que Task no estaba completamente calificado ... entiendes el punto ).
Lo que luego encontré fue async override void onActionExecuting(...
en un controlador base. Claramente ese tenía que ser el problema, y así fue. Arreglar eso (haciéndolo sincrónico por el momento) resolvió el problema.
Volver a la pregunta: ¿Por qué, oh, por qué puedes marcar una anulación como asincrónica cuando el código de llamada nunca podría esperarla?