В С#, когда вы переопределяете метод, разрешается переопределять async, когда оригинальный метод не был. Это похоже на плохую форму.
Проблема, которая заставляет меня задуматься, заключается в следующем: я был вовлечен, чтобы помочь с проблемой тестирования нагрузки. Около 500 одновременных пользователей процесс входа в систему будет разбит на цикл перенаправления. IIS регистрировал исключения с сообщением "Асинхронный модуль или обработчик завершен, пока асинхронная операция все еще ожидает". Некоторые поиски заставили меня подумать, что кто-то злоупотреблял async void
, но мои быстрые поиски через источник ничего не нашли.
К сожалению, я искал async\s*void
(поиск в регулярном выражении), когда мне нужно было искать нечто вроде async\s*[^T]
(при условии, что Task не был полностью укомплектован.. вы поняли смысл).
То, что я позже обнаружил, было async override void onActionExecuting
в базовом контроллере. Понятно, что это была проблема, и это было так. Фиксация этого (что делает его синхронным на данный момент) разрешило проблему.
Но это оставило меня с вопросом: почему вы можете пометить переопределение как async, когда вызывающий код никогда не мог его ждать?