2010-08-25 9 views
6

Ich spawn ein Worker-Thread in einer ASP.NET-Anwendung, die auf Windows Server 2008, IIS 7.5 ausgeführt wird Das erste, was dieser Worker-Thread ausführt, ist Ruhezustand für N Sekunden, und dann führt es seine eigentliche Arbeit aus. Während des Schlafs fangen Sie eine ThreadAbortException ab.Warum führt ein Worker, der mein ASP.NET-Spawn erleidet, während eines Schlafs eine ThreadAbortException durch?

Können Sie dieses Verhalten erklären, und Bonuspunkte von Ihnen weisen mich auf alle IIS/ASP.NET-Einstellungen, die zum Anpassen des Verhaltens verwendet werden können.

EDIT: Weitere Informationen. Der Vorschlag, die ThreadAbortException zu erfassen, hat mir geholfen, das Problem zu umgehen, also danke. Ich habe den Wortlaut dieser Frage völlig neu geschrieben, basierend auf dem, was ich gelernt habe, aber immer noch die gleiche Frage, WARUM wird dieser Worker Thread während eines Schlafes abgebrochen?

+0

Was passiert, wenn Sie zwei aufeinander folgende Perioden von 17 Sekunden oder weniger schlafen? –

+2

warum nicht versuchen, um den gesamten Thread-Handler zu fangen und zu sehen, was passiert? Höchstwahrscheinlich erhalten Sie eine ThreadAbortException, die möglicherweise etwas Nützliches enthält. –

+0

@Robert - kein Problem @ liho1eye - werde tun –

Antwort

6

Ein ThreadAbortException passiert auf Ihrem Arbeitsthread, weil jemand anders Thread.Abort darauf angerufen hat, also ist es wahrscheinlich nichts direkt, was Ihr Worker-Thread tat, sondern eher eine externe Ursache. Der erste Ort, den Sie überprüfen sollten, ist Ihr eigener Code für alle Thread-Verwaltung oder den Abbruch, die Sie tun könnten. Andernfalls kann dies für IIS darauf zurückzuführen sein, dass ein Worker-Prozess (w3wp.exe) oder App-Pool oder AppDomain wiederverwendet wird.

Die Wiederverwendung ist möglicherweise auf die Leerlauf-Zeitüberschreitungseinstellung für den App-Pool, eine regelmäßig geplante Wiederverwendung oder einen Speicher-/CPU-Verwendungstrigger zurückzuführen. Diese sind über den IIS-Konfigurationsmanager im Server-Explorer (unter Win 2K8) oder einfach durch Ausführen von inetmgr.exe konfigurierbar. Nach Tess' Blog here, gibt es eine Reihe weiterer Gründe für die AppDomain-Recycling:

  • Machine.config Web.config oder Global.asax modifiziert wird
  • Das bin-Verzeichnis oder dessen Inhalt geändert
  • die Anzahl der Wiederzusammenstellungen (aspx, ascx oder asax) den Grenzwert überschreitet durch die Einstellung in machine.config oder web.config angegeben
  • der pH-Wert (standardmäßig auf 15 eingestellt ist) ysical Pfad des virtuellen Verzeichnisses wird
  • modifizierte
  • Die CAS-Richtlinie geändert wird
  • Der Webservice ist
  • neu gestartet
  • (2.0 nur) Anwendung Unterverzeichnisse
  • gelöscht

Dass auch Blog-Post hat Informationen darüber, warum ein Recycling stattgefunden hat. Versuchen Sie zunächst, im Ereignisprotokoll (eventvwr.msc) nach detaillierten Informationen zu suchen.

Sie können auch versuchen, den Worker-Prozess direkt zu debuggen. Hängen Sie den VS-Debugger an die w3wp.exe-Instanz an, auf der der Code ausgeführt wird, fügen Sie unter Thread.Abort einen Haltepunkt hinzu (möglicherweise müssen Sie in den Debuggeroptionen ".NET Framework-Quellschritt" aktivieren) und mithilfe von Aufruf-Stack-Fenster. Das wird dir nicht sagen, warum es passiert, aber zumindest wirst du wissen, wer es macht.

+0

Ich kann den Thread nicht direkt debuggen, weil das Problem auf einem Host-Provider-Maschine passiert, aber nicht auf Maschinen, die ich kontrolliere.Meine Logik bricht den Thread nicht ab. Das Standard-Inaktivitätszeitlimit ist in Minuten, während dieses Problem auftritt, wenn mein Thread 20 Sekunden oder so schläft. Keine der anderen Gründe für das Recycling gelten. No Response.Redirect noch Response.End ist beteiligt. Also ... immer noch ein Mysterium. –

+0

Ich habe gerade mein Problem gelöst: meine Threads wurden in der Mitte abgebrochen, und das passierte, weil ich meine Logs in den "bin" -Ordner geschrieben habe (was dazu führte, dass IIS zurückgesetzt wurde) ... – Illidan