Richtig implementiert hintergrund-Prozess Thread in ASP.NET
Ich ausführen müssen, eine unendliche while-Schleife und wollen zum initiieren der Ausführung in global.asax
.
Meine Frage ist, wie genau soll ich das machen? Sollte ich einen neuen Thread starten, oder sollte ich Async und Aufgabe oder etwas anderes? Innerhalb der while-Schleife muss ich tun await TaskEx.Delay(5000);
Wie mache ich das, damit es nicht blockieren andere Prozesse und erstellen keine memory leaks?
Ich benutze VS10,AsyncCTP3,MVC4
EDIT:
public void SignalRConnectionRecovery()
{
while (true)
{
Clients.SetConnectionTimeStamp(DateTime.UtcNow.ToString());
await TaskEx.Delay(5000);
}
}
Alles, was ich zu tun ist, führen Sie dies als eine singleton-Instanz, die Global so lange, wie die Anwendung verfügbar ist.
EDIT:GELÖST
Dies ist die endgültige Lösung in der Globalen.asax
protected void Application_Start()
{
Thread signalRConnectionRecovery = new Thread(SignalRConnectionRecovery);
signalRConnectionRecovery.IsBackground = true;
signalRConnectionRecovery.Start();
Application["SignalRConnectionRecovery"] = signalRConnectionRecovery;
}
protected void Application_End()
{
try
{
Thread signalRConnectionRecovery = (Thread)Application["SignalRConnectionRecovery"];
if (signalRConnectionRecovery != null && signalRConnectionRecovery.IsAlive)
{
signalRConnectionRecovery.Abort();
}
}
catch
{
///
}
}
Fand ich diesen netten Artikel über die Verwendung von async-Arbeiter: http://www.dotnetfunda.com/articles/article613-background-processes-in-asp-net-web-applications.aspx
Und so:
http://code.msdn.microsoft.com/CSASPNETBackgroundWorker-dda8d7b6
Aber ich denke für meine Bedürfnisse wird dieser hier perfekt:
http://forums.asp.net/t/1433665.aspx/1
Was bedeutet Kunden.SetConnectionTimeStamp tun? Was ist der Zweck davon? Welche spezifischen Funktionen Sie sind auf der Suche zu implementieren? Wenn Sie wollen ein qualitativ hochwertiges beantworten, müssen Sie diese Informationen bereitstellen.
Dies ist besser, es zu tun mit einem timer.
Ich möchte Rundfunk über einen Hub von außerhalb der Hub - github.com/SignalR/SignalR/wiki/Hubs
Wenn Sie waren in der Lage, Ihre eigene Frage zu beantworten, bitte poste es als Antwort und markieren Sie es als akzeptiert.
InformationsquelleAutor Registered User | 2012-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
ASP.NET ist nicht darauf ausgelegt, diese Art von Anforderung. Wenn Sie etwas brauchen, ständig zu laufen, Sie wäre besser dran, erstellen eines windows-Dienstes.
Update
ASP.NET ist nicht ausgelegt für die lange laufende Aufgaben. Es wurde entwickelt, um schnell reagieren zu HTTP-Anfragen. Sehen Cyborgx37 Antwort oder Kann ich threads durchführen, Aufträge mit langer Laufzeit auf IIS? für ein paar Gründe, warum.
Update
Nun, dass Sie endlich erwähnt Sie arbeiten mit SignalR, ich sehe, dass Sie versuchen zu host SignalR innerhalb ASP.NET, richtig? Ich glaube, Sie gehen über dies der falsche Weg, siehe das Beispiel NuGet-Paket verwiesen auf die Projekt-wiki. In diesem Beispiel wird ein
IAsyncHttpHandler
, um Aufgaben zu verwalten.... sehr offensichtliche Besorgnis, dass der server möglicherweise wählen, um das Recycling der app-pool irgendwann Das ist eine ziemlich große Sache...
Alle Anwendungen gehen Sie unten an einem gewissen Punkt, das ist nicht eindeutig zu ASP.NET. Sie streiten gegen hintergrund jobs in WinForms-Anwendungen, da kann der Benutzer auf den schließen-button zu jeder Zeit? Auch Windows-Dienste müssen nach unten gehen, wenn der server neu gestartet wird. Wie ist das anders?
Ich argumentiere nicht auf alle, nur unter Angabe meine Meinung :). Ich glaube nicht, dass das unbedingt ein parallel-Vergleich, weil in beiden Formen und Dienstleistungen, eine Benutzer-Aktion ist ein Herunterfahren der Anwendung, während die IIS-Anwendungspool recycelt werden könnten, aus mehreren Gründen außerhalb der Kontrolle des Benutzers (Lebensdauer, request count, Speicherauslastung, etc).
InformationsquelleAutor jrummell
Können Sie beginnen, einen thread in deine global.asax, allerdings läuft es nur bis zu Ihrem asp.net Prozess recycelt. Dies geschieht mindestens einmal am Tag, oder wenn niemand nutzt Ihrer Website. Wenn der Prozess recycelt wird, ist der einzige Weg, der thread neu gestartet wird agian, ist, wenn Sie einen Treffer auf Ihre Website. Damit der thread nicht ausgeführt wird continueuosly.
Bekommen ein weiter Prozess ist es besser, einen windows-Dienst starten.
Wenn Sie tun, die "In-process" - Lösung, ist es wirklich hängt davon ab, was Ihr tut. Der Thread selbst wird nicht dazu führen Sie irgendwelche Probleme im Speicher oder deadlocks. Sollten Sie einen meganism zu stoppen deinem thread, wenn die Anwendung angehalten. Ansonsten Neustart dauert eine lange Zeit, da wird es warten, bis der thread zu stoppen.
Danke! Ich habe bearbeitet Sie meine Frage mit mehr details.
Ich Stimme mit peer. Die Lösung und eine Warnung an die Gefahren dieser finden sich in diesem tollen Artikel: haacked.com/archive/2011/10/16/...
InformationsquelleAutor Peter
Dies ist eine alte post, aber da war ich seraching für diese, ich möchte zu berichten, dass in .NET 4.5.2 gibt es eine native Art und Weise, es zu tun mit QueueBackgroundWorkItem.
Werfen Sie einen Blick auf diesen Beitrag: https://blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-background-processes-in-asp-net/
MarianoC
InformationsquelleAutor MarianoC
Es hängt davon ab, was Sie versuchen zu erreichen, in deiner while-Schleife, aber im Allgemeinen ist dies die Art von situation, wo ein Windows-Dienst ist die beste Antwort. Installieren ein Windows-Dienst wird verlangt, dass Sie admin-Rechte auf dem web-server.
Mit einer Endlosschleife, die Sie am Ende mit einer Menge von Fragen hinsichtlich der Windows-Nachrichtensystem. Das ist es, was hält eine Windows-Anwendung lebendig, auch wenn die Anwendung nicht "tun" nichts. Ohne es, ein Programm einfach endet.
Das problem mit einer endlos-Schleife ist, dass die Anwendung hängen geblieben ist "tun" etwas, das verhindert, dass andere Anwendungen (oder threads) von "machen" Ihre Sache. Es wurden ein paar Lösungen, wie die DoEvents in Windows-Formen, aber Sie alle haben einige gravierende Nachteile, wenn es um die Reaktionsfähigkeit und Ressourcen-management. (Akzeptabel auf einem kleinen LOB-Anwendung, vielleicht nicht auf einem web-server.) Auch wenn die while-Schleife auf einem separaten thread, es wird alle zur Verfügung stehende Rechenleistung.
Asynchronus Programmierung ist wirklich entwickelt mehr für lang andauernde Prozesse, wie warten auf einer Datenbank, die ein Ergebnis zurückgeben oder warten auf einen Drucker online zu kommen. In diesen Fällen ist der externe Prozess, der eine lange Zeit, nicht eine while-Schleife.
Wenn ein Fenster mit einem Dienst nicht möglich ist, dann denke ich, Ihre beste Wette ist, gehen, um die Einrichtung einer gesonderten thread mit eigenem Nachrichtensystem, aber es ist ein bisschen kompliziert. Ich habe es nie getan, die auf einem web-server, aber Sie könnten in der Lage sein, eine Anwendung zu starten. Dies wird ein Nachrichtensystem für Sie und ermöglichen es Ihnen, zu reagieren, um die Windows-Ereignisse, etc. Das problem ist nur, dass dies ein Windows-Programm starten (entweder WPF oder WinForms), die möglicherweise nicht wünschenswert sein, auf einem web-server.
Was sind Sie versuchen zu erreichen? Gibt es eine andere Möglichkeit man könnte es gehen?
InformationsquelleAutor JDB
Fand ich diesen netten Artikel über die Verwendung von async Arbeiter, give it a try. http://www.dotnetfunda.com/articles/article613-background-processes-in-asp-net-web-applications.aspx
Und so:
http://code.msdn.microsoft.com/CSASPNETBackgroundWorker-dda8d7b6
Aber ich denke für meine Bedürfnisse wird dieser hier perfekt:
http://forums.asp.net/t/1433665.aspx/1
Naja, deshalb habe ich geschrieben die OP, aber leider auf SO es ist zu viel Lärm... Auch wenn Sie gelesen hatte, die OP selbst, Sie hätte gewusst, dass der thread zu lange schlafen, damit es keine CPU-Problem gibt.
InformationsquelleAutor Registered User