En C #, lorsque vous remplacez une méthode, il est autorisé de faire la substitution asynchrone alors que la méthode d'origine ne l'était pas. Cela semble être une mauvaise forme.
L'exemple qui m'a amené à ceci est le suivant: j'ai été amené pour aider avec un problème de test de charge. À environ 500 utilisateurs simultanés, le processus de connexion se décomposerait en une boucle de redirection. IIS enregistrait des exceptions avec le message "Un module ou un gestionnaire asynchrone s'est terminé alors qu'une opération asynchrone était toujours en attente". Certaines recherches m'ont amené à penser que quelqu'un abusait async void
, mais mes recherches rapides dans la source n'ont rien trouvé.
Malheureusement, je cherchais «async \ svoid» (recherche d'expression régulière) alors que j'aurais dû chercher quelque chose de plus comme «async \ s [^ T]» (en supposant que la tâche n'était pas pleinement qualifiée… vous obtenez le point).
Ce que j'ai trouvé plus tard était async override void onActionExecuting(...
dans un contrôleur de base. De toute évidence, cela devait être le problème, et c'était le cas. Le corriger (le rendre synchrone pour le moment) a résolu le problème.
Retour à la question: pourquoi oh pourquoi pouvez-vous marquer un remplacement comme asynchrone alors que le code appelant ne pourrait jamais l'attendre?
Task
.