Ich wechsle von Task.Run zu Hangfire . In .NET 4.5+ Task.Run
kann Task<TResult>
zurückgeben, was mir ermöglicht, Aufgaben auszuführen, die andere als void
zurückgeben. Ich kann normalerweise warten und das Ergebnis meiner Aufgabe erhalten, indem ich auf die Eigenschaft MyReturnedTask.Result
Beispiel für meinen alten Code:
%Vor% Soweit ich von der Schnellstart Seite von Hangfire, Ihrem Hauptdarsteller, sehen kann was ist BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget"));
führt den Code perfekt als Hintergrundjob aus, unterstützt aber anscheinend keine Jobs, die einen Rückgabewert haben (wie der oben dargestellte Code). Ist das richtig? wenn nicht, wie kann ich meinen Code optimieren, um Hangfire zu verwenden?
P.S. Ich habe mir bereits HostingEnvironment.QueueBackgroundWorkItem
angesehen ( hier ), aber es fehlt offensichtlich die gleiche Funktionalität (Hintergrundjobs müssen void
sein)
BEARBEITEN
Wie @Dejan herausgefunden hat, ist der Hauptgrund, warum ich zu Hangfire wechseln möchte, der gleiche Grund, warum die .NET-Leute QueueBackgroundWorkItem
in .NET 4.5.2 hinzugefügt haben. Und dieser Grund wird in Scott Hanselmans großartigem Artikel über Hintergrundaufgaben in ASP.NET gut beschrieben. Also werde ich aus dem Artikel zitieren:
QBWI (QueueBackgroundWorkItem) plant eine Aufgabe, die unabhängig von jede Anfrage. Dies unterscheidet sich von einem normalen ThreadPool-Arbeitselement darin ASP.NET protokolliert automatisch, wie viele Arbeitselemente registriert wurden über diese API laufen derzeit, und die ASP.NET-Laufzeit wird Versuchen Sie, AppDomain herunterzufahren, bis diese Arbeitselemente beendet sind Ausführen.
Eine einfache Lösung wäre, die Überwachungs-API abzufragen, bis der Job wie folgt beendet ist:
%Vor% Achtung : Natürlich können Sie sich in einem Web-gehosteten Szenario nicht darauf verlassen, dass die Aufgabe ( task.ContinueWith()
) fortgesetzt wird, nachdem der Job beendet wurde, da die AppDomain möglicherweise heruntergefahren wird - Aus denselben Gründen möchten Sie wahrscheinlich Hangfire verwenden.
Tags und Links c# asp.net asynchronous hangfire