Frage

Ich habe eine ASP.Net-Anwendung, die aus einigen Hintergrund Arbeiter feuert ThreadPool.QueueUserWorkItem () verwenden. Die meiste Zeit wird es Null Hintergrund-Threads ausgeführt werden, aber es ist möglich, dass es occationally auf 5-6 zu einem Zeitpunkt ausgeführt werden sein könnte. Darüber hinaus wird vervollständigen die meisten innerhalb von ein paar Sekunden, aber es ist möglich, dass sie so lange wie 10 Minuten laufen konnte.

Bei all den verschiedenen Szenarien, die eine Abschaltung einer ASP.Net-Anwendung verursachen könnten, würde Ich mag diese Ausfahrt Hintergrundprozesse anmutig haben, wenn möglich, wenn die Anwendung benötigt zum Herunterfahren und sie in der Mitte der Verarbeitung sind.

Ich erwarte nicht zu viel von einem Problem mit einer Art und Weise zu schaffen, die Prozesse zu signalisieren, ihre Arbeit früh und innerhalb von wenigen Sekunden aufzuräumen zu stoppen den Anruf bekommen, dass die Anwendung heruntergefahren wird. Obwohl, wenn jemand spezifische Beratung zu diesem Thema hat würde ich es sicher zu schätzen wissen.

Meine zwei Hauptfragen sind:

1) Wenn wäre der richtige Zeitpunkt sein, um die Hintergrundarbeiter zu sagen, Dinge einpacken. Während Application_End? Dispose ()? Oder vielleicht eine dritte Option bin ich nicht bekannt.

2) Wenn ich während der obigen Veranstaltung für die Prozesse bis zum Ende warten vor der Rückkehr gibt es einen Punkt, an dem nicht mit Application_End Rückkehr sofort mehr ernsthafte Probleme für die Anwendung dazu führen könnten, als nicht die Hintergrundjobs schön heruntergefahren.

void Application_End(object sender, EventArgs e) 
{
    //if this for whatever reason takes a non-trivial time to execute, what problems could I encounter? 
    SignalBackgroundJobsAndWaitForThemToShutDown();
}

Danke!

War es hilfreich?

Lösung

Die geeignete Zeit ist auf der Seite Application_End

Jetzt, nachdem Sie Ihre Hintergrundjobs signalisieren Sie für sie an diesem Punkt zu Ende warten müssen, und dann lassen Sie weiter, wie sein scheint, dass Sie tun.

Haben Sie in mir, was gut ist, eine Zeit zu setzen heraus auf der Warte, warte nicht ewig sonst kann Ihr Pool hat Probleme, oder Herunterfahren, dann müssen Sie Ihre Pool-Einstellung auf dem max Warten bis zum Abschalten des Pool überprüfen gibt einen Wert größer als Ihre Warte eingestellt, oder es einfach deaktiviert.

Auch in mir hat, wenn Sie Pool Garten haben, (mehr als 1 Arbeitspool), dann die Application_End für jeden Pool ein Mal aufgerufen wird.

Ich benutze die gleiche Technik auf meinen Seiten, die gleiche Art, wie ich meine Fäden signalisieren die gleiche Art und Weise zu stoppen, ich log gerade auch das endgültige Ende, und prüfen Sie, wenn sie Endzweck sind, und ich meine Routinen auch zwingen, zu stoppen und nicht lassen sie sie für viel Zeit. Die Application_End ist der Pool auf Recycling genannt, oder wenn Sie die app_offline.htm Datei zu öffnen, oder wenn Sie gehen, um den Web-Dienst zu schließen. Persönlich habe ich die recycles deaktivieren, ich brauche sie nicht und ich nur die app_offline.htm öffnen, wenn ich Updates machen. In diesem Moment warte ich meine Pool Threads ihre Arbeit zu beenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top