W języku C #, gdy przesłonisz metodę, dozwolone jest, aby zastąpienie było asynchroniczne, gdy oryginalna metoda nie była. To wygląda na kiepską formę.
Przykładem, który mnie do tego przywiódł, był ten: zostałem sprowadzony, aby pomóc z problemem testu obciążenia. Przy około 500 jednoczesnych użytkownikach proces logowania rozpadłby się w pętli przekierowań. Usługi IIS rejestrowały wyjątki z komunikatem „Moduł asynchroniczny lub moduł obsługi zakończono, gdy operacja asynchroniczna była nadal w toku”. Poszukiwania doprowadziły mnie do wniosku, że ktoś znęcał się async void
, ale moje szybkie przeszukanie źródła nic nie dało .
Niestety szukałem „asynchronizacji” (wyszukiwanie wyrażeń regularnych), kiedy powinienem szukać czegoś bardziej podobnego do „asynchronizacji [^ T]” (zakładając, że zadanie nie było w pełni kwalifikowane… masz rację).
Później znalazłem async override void onActionExecuting(...
w kontrolerze podstawowym. Oczywiście to musiał być problem i tak było. Naprawienie tego problemu (na chwilę synchronizacja) rozwiązało problem.
Powrót do pytania: dlaczego och, dlaczego można oznaczyć zastąpienie jako asynchroniczne, gdy kod wywołujący nigdy nie może na niego czekać?
Task
.