2012-10-23 11 views
7

.net 4.5, asp.net mvc: Was ist der beste Weg, lang anhaltende Prozess (1-2 Minuten) von ASP.NET-Anwendung zu laufen, sollte es in einer single-threaded Umgebung ausgeführt werden, ich meine, der Prozess ist nur für jeweils einen Benutzer gestartet, müssen die Ausführungen für alle anderen Benutzer warten, bis die aktuelle Ausführung abgeschlossen ist? Das Szenario ist das Folgende: Der Benutzer klickt auf die Schaltfläche, die eine Art langanhaltender Berechnungen ausführt. Die HTTP-Antwort wird sofort an den Benutzer zurückgegeben. Anschließend muss der Benutzer den Status der Berechnungen mit einer separaten Anforderung manuell anfordern. Asp.net http Sitzung Abtreibung sollte nicht zum Abschluss des Prozesses führen, sollte es weitergehen. Der Prozess wird möglicherweise auf demselben oder einem separaten Server ausgeführt.Wie man langanhaltenden Prozess asynchron unter ASP.net ausführen?

+0

Können Sie einen Dienst auf dem Computer hinzufügen? – Patrick

+0

Ich kann, aber ich frage mich, wie Sie für jeden Web-App-Thread fortlaufende Ausführung bereitstellen? – YMC

Antwort

3

Ich würde empfehlen, ein Produkt wie NServiceBus zu verwenden, um die Verarbeitung zu entladen und es im Single-Thread-Modus auszuführen. Dies hat den Vorteil, dass alle Anfragen der Reihe nach bearbeitet werden und die Verarbeitung vom Web-Server ausgelagert werden kann, da nicht wirklich lange laufende Prozesse auf einem Webserver stattfinden sollen.

+0

Wir erwägen diese Optionen tatsächlich. Es gibt Vorteile wie Sie erwähnt, aber es gibt auch Nachteile wie notwendige Infrastruktur-Setup: MSMQ, Erstellen von Nachrichtenwarteschlangen, separate Konfiguration – YMC

+0

NServiceBus wird viel davon für Sie behandeln (Installation und Konfiguration von MSMQ & DTC) es wurde entwickelt, um die zu lösen Problem, das du erwähnt hast. –

+0

Ich mag NSBus, wahrscheinlich ist es die beste Lösung für uns, aber was ich meinte, ist, dass es für diese Lösung einige zusätzliche administrative Kosten wie folgt geben wird: 1) MSMQ, RavenDb und vielleicht etwas anderes muss installiert werden, ich erinnere mich an uns musste sie separat herunterladen und einrichten, sie waren nicht Teil des NSBus-Pakets, 2) Jemand muss regelmäßig die fehlgeschlagene Nachrichtenwarteschlange überprüfen, zusätzlich zu unserer regulären Protokolldatei (zwei App-Tracking-Punkte anstelle von einem) 3) Der separate Prozess bedeutet es angenommen um eine eigene Konfiguration zu haben (zwei Konfigurationsdateien zu managen statt einer) – YMC

4

.Net 4.5.2 fügt QueueBackgroundWorkItem hinzu, die Sie zum Planen einer Aufgabe verwenden können. Wenn Sie den Server nicht steuern (wenn er neu gestartet wird), funktioniert die 90-Sekunden-Standardverzögerung des Herunterfahrens von appPool nicht (es sei denn, Sie können feststellen, dass der Task nicht abgeschlossen wurde und auf einem anderen Server ausgeführt wird). Weitere Informationen finden Sie unter "QueueBackgroundWorkItem to reliably schedule and run background processes in ASP.NET"

12

Ich zeige Ihnen, wie Sie diese Aufgabe mit http://hangfire.io - unglaublich einfache Möglichkeit, um Fire-und-Forget, verzögerte und wiederkehrende Aufgaben innerhalb von ASP.NET-Anwendungen durchzuführen. Kein Windows-Dienst erforderlich.

Zuerst installieren Sie das Paket über NuGet. Wenn Sie Probleme haben, lesen Sie bitte den Leitfaden Quick Start in der offiziellen Dokumentation.

PM> Install-Package Hangfire 

Öffnen Sie Ihre OWIN Startup-Klasse und fügen Sie die folgenden Zeilen:

public void Configure(IAppBuilder app) 
{ 
    GlobalConfiguration.Configuration.UseSqlServerStorage("connection_string"); 

    app.UseHangfireDashboard(); 
    app.UseHangfireServer(); 
} 

dann die Methode schreiben, die die lang andauernde Arbeit tun (I angewendet Attribut nur eine Methode zu einem Zeitpunkt durchzuführen) :

[DisableConcurrentExecution] 
public void LongRunning() 
{ 
    // Some processing stuff 
} 

und dann ein Verfahren im Hintergrund als Feuer-and-Forget rufen Benutzer sofort zu reagieren:

public ActionResult Perform() 
{ 
    BackgroundJob.Enqueue(() => LongRunning()); 
    return View(); 
} 

Wenn Sie einen Benutzer über den Abschluss eines Jobs informieren möchten, sollten Sie SignalR in Betracht ziehen und die Methode LongRunning entsprechend anhängen.

+0

Große Lösung. Danke für den Rahmen. – scottheckel

Verwandte Themen