In C# ist es beim Überschreiben einer Methode zulässig, die Außerkraftsetzung asynchron zu machen, wenn die ursprüngliche Methode dies nicht war. Dies scheint eine schlechte Form zu sein.Warum erlaubt C# das Überschreiben von Asyncs?
Das Problem, das mich wundern lässt, ist das: Ich wurde hereingebracht, um mit einem Belastungstestproblem zu helfen. Bei ungefähr 500 gleichzeitigen Benutzern würde der Anmeldevorgang in eine Weiterleitungsschleife aufgeteilt. IIS protokollierte Ausnahmen mit der Nachricht "Ein asynchrones Modul oder eine Prozedur, die ausgeführt wurde, während ein asynchroner Vorgang noch ausstehend war". Einige Suche führte mich zu der Annahme, dass jemand async void
missbrauchte, aber meine schnelle Suche durch die Quelle fand nichts.
Leider war ich auf der Suche nach async\s*void
(Regex-Suche), wenn ich nach etwas mehr wie async\s*[^T]
suchen sollte (vorausgesetzt, Aufgabe wurde nicht vollständig qualifiziert .. Sie bekommen den Punkt).
Was ich später fand, war async override void onActionExecuting
in einem Basiscontroller. Das musste eindeutig das Problem sein, und das war es auch. Das zu beheben (was es für den Moment synchron macht) löste das Problem.
Aber es ließ mich mit einer Frage: Warum können Sie eine Überschreibung als async markieren, wenn der aufrufende Code es nie erwarten könnte?
async void ist ein korrektes Muster für Ereignishandler. Warnungen nicht ignorieren. –
Ich stimme nicht zu - aber in diesem Fall ist das ursprüngliche Ereignis nicht asynchron. –
Ich vermute, das ist nicht wirklich [ein praktisches, beantwortbares Problem] (http://stackoverflow.com/help/on-topic); Sie interessieren sich eher für die philosophisch/technischen Gründe, warum dies erlaubt ist. –