Ich habe den folgenden Code in meinem Codebehind (aspx.cs):
%Vor%Kehrt ASP.NET alle untergeordneten Threads ab, wenn die Anforderung endet?
PS. Ich sage viel voraus, weil es keine Best Practice-Antworten sind. Ich weiß über Best Practices der Ausführung von Dingen in einem Windows-Dienst usw. Ich bin nur neugierig WARUM GENAU der Thread in diesem bestimmten Code getötet wird, gibt es keine "Response.Redirect", keine "Response .End ", kein Pool-Recycle, kein IIS-Neustart usw. (typische Gründe, warum die Leute das" Hintergrund-Thread in ASP.NET ist schlecht "Mantra wiederholen).
UPDATE: Wie sich herausstellt, funktioniert gut in ASP.NET MVC !!! Der Thread wird nur in Web-Forms abgebrochen !! Was noch seltsamer ist. Irgendwelche Ideen?
Ok, also nach 48 Stunden Experimentieren hier ist was ich gefunden habe:
Wenn Sie auf MVC sind - starten Sie einfach Ihre Threads als normal, sie werden nicht abgebrochen, nachdem die aktuelle Anfrage endet:
%Vor%Ich habe gelernt, dass Sie mit Webforms nicht verwenden können:
new Thread().Start(); //not working
ThreadPool.QueueUserWorkItem //not working
Action.BeginInvoke //not working
Ein Haufen anderer Dinge - alles funktioniert nicht
Folgendes müssen Sie tun:
1) Markieren Sie Ihre Seite als "async" in .aspx (dies weist ASP.NET an, die Seite von IAsyncHandler zu übernehmen)
%Vor%2) Verwenden Sie BackgroundWorker in .aspx.cs
%Vor%HostingEnvironment.QueueBackgroundWorkItem
"Die Methode HostingEnvironment.QueueBackgroundWorkItem lässt Sie Planen Sie kleine Hintergrundarbeitselemente ein. ASP.NET verfolgt diese Elemente und verhindert, dass IIS den Worker-Prozess abrupt beendet Hintergrundarbeitselemente wurden abgeschlossen. Diese Methode kann nicht aufgerufen werden außerhalb einer verwalteten ASP.NET-App-Domain. "
Kudos zu @ danny-tuppeny für diese letzte
Am Ende einer Antwort wird normalerweise ein Thread beendet, ja. Wenn Sie Response.End
aufrufen, können Sie sogar sehen, dass IIS eine ThreadAbortedException
absetzt, um den Thread sofort zu beenden. Im Allgemeinen sollten Sie keine lange laufenden Aufgaben in IIS ausführen, insbesondere nicht auf einer Aufgabe oder einem Hintergrund-Thread. Weitere Informationen dazu, warum Sie dies vermeiden sollten, sowie Informationen dazu, wie Sie IIS dazu zwingen können, Ihre lang andauernden Vorgänge zu handhaben (falls dies wirklich erforderlich ist), finden Sie in den folgenden Links:
Der ASP.NET-Workerprozess entlädt virtuelle Anwendungen, wenn keine Anforderungen aspx / asmx-Seiten treffen, um Speicher auf IIS zu speichern.
IIS löst Ihren Thread aus, weil es kein Hintergrundthread ist.
Bei IIS gibt es diese Option:
%Vor%Tags und Links c# multithreading asp.net