Task.Run vs. ContinueWith in ASP.NET MVC

8

Sagen Sie in meiner ASP.NET MVC 4-Anwendung, dass ich eine async -Methode habe:

%Vor%

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?

    
Sebastian Krysmanski 15.04.2014, 09:21
quelle

1 Antwort

5

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:

    %Vor%

    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.

    
Noseratio 15.04.2014, 10:04
quelle