Sagen Sie in meiner ASP.NET MVC 4-Anwendung, dass ich eine async
-Methode habe:
Nun kann man diese Methode so nennen:
%Vor%oder das:
%Vor%Beachten Sie, dass der Aufrufer in beiden Versionen nicht auf den Abschluss der Hintergrundaufgabe wartet. Es ist nur Feuer und vergessen.
Während beide Versionen in regulären .NET-Anwendungen identisch funktionieren (Ausnahmen werden hier ignoriert), wird in einer MVC-Anwendung beim Aufruf des Codes von einer MVC-Controller-Methode nur Debug.WriteLine
ausgeführt Task.Run
version - aber nicht in der ContinueWith
version.
Kann jemand etwas Licht in die Frage bringen, warum diese beiden Versionen anders funktionieren, wenn sie in einer MVC-Controller-Methode aufgerufen werden?
Dies ist wahrscheinlich etwas, das spezifisch für Ihre Web-App ist, also kann ich nur spekulieren, aber hier ist was ich denke:
Es sollte funktionieren, wenn Sie dies tun:
%Vor% Dies wäre näher an der Task.Run
Version, wo die Fortsetzung synchron läuft.
Kurz bevor Sie DoSomeBackgroundWork
direkt von der Controller-Methode aufrufen, fügen Sie Folgendes hinzu:
Wenn die Ausgabe irgendetwas anderes als ThreadPoolTaskScheduler
ist, könnte ich dieses Verhalten weiter erklären (da ich gerade ein etwas ähnliches Problem behandelt habe) hier ).
Übrigens, das Verwenden von Fire-and-Forget in ASP.NET ist wirklich keine gute Idee, es gibt viele Fragen zu SO, die das diskutieren.
Tags und Links asp.net-mvc c# task-parallel-library asp.net async-await