.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?
Antwort
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.
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
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. –
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
Ich würde einen Blick darauf werfen, geschrieben von Phil Haack, erklärt die Probleme, die Sie im Hintergrund Aufgaben in einer Webanwendung ausführen können. http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx
Das war ein toller Post in der heutigen Zeit, aber er ist jetzt veraltet (zumindest für WAWS). Siehe meine Azure WebJobs Antwort – RickAndMSFT
.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"
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.
Große Lösung. Danke für den Rahmen. – scottheckel
- 1. Wie kann man Python-Code asynchron ausführen?
- 2. Wie konfiguriert man den ASP.net-Prozess unter einem Domänenkonto?
- 3. ASP.NET Entity Framework 6 gespeicherte Prozedur asynchron ausführen
- 4. asp.net asynchron die Aufgaben ausführen und UI aktualisieren
- 5. Prozess in Echtzeit ausführen
- 6. clojure: spawnen Sie einen Prozess asynchron
- 7. Wie man Werte asynchron zurücksetzt
- 8. Wie liest man Dateien asynchron in C++?
- 9. Apache Nifi Prozess ausführen Prozessor
- 10. wxPython: Befehl asynchron ausführen, stdout im Text-Widget anzeigen
- 11. Langsame Aufgaben asynchron in Rails ausführen?
- 12. Ausführen res.render asynchron in Express App
- 13. Wie "unterbrechungsfreie" Prozess unter Linux zu stoppen?
- 14. Wie der Prozess unter UNIX/LINUX einzuengen
- 15. Prozess ausführen und nicht warten
- 16. Externe Prozesse asynchron in einem Windows-Dienst ausführen
- 17. Wie kann man eine Datei asynchron lesen?
- 18. Roslyn: Wie man mehrere Projekte asynchron aktualisiert?
- 19. Wie kann man db-Daten asynchron lesen?
- 20. Wie kann ich einen externen Befehl asynchron von Python ausführen?
- 21. Wie kann ich einen Systembefehl in Perl asynchron ausführen?
- 22. Wie mehrere Asynchron-Funktionen dann ausführen Rückruf Code
- 23. Methode im neuen Prozess ausführen
- 24. Elevate NodeJS/Electron Prozess unter Windows
- 25. Prozess-Erstellung unter Java verlangsamen?
- 26. WebClient in ASP.NET MVC asynchron verwenden?
- 27. Langer Prozess in ASP.Net MVC
- 28. Get Prozess-Speicher unter Windows
- 29. Multiprocessing Prozess beendet unter Linux
- 30. versucht, einen Prozess aus einer asp.net-Anwendung
Können Sie einen Dienst auf dem Computer hinzufügen? – Patrick
Ich kann, aber ich frage mich, wie Sie für jeden Web-App-Thread fortlaufende Ausführung bereitstellen? – YMC