Warum ASP.NET meinen Hintergrund Thread tötet?

8

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?

    
Alex 05.05.2014, 22:39
quelle

4 Antworten

12

Ok, also nach 48 Stunden Experimentieren hier ist was ich gefunden habe:

1. Es ist in Ordnung, Hintergrundthreads in ASP.NET _MVC _ auszuführen

Wenn Sie auf MVC sind - starten Sie einfach Ihre Threads als normal, sie werden nicht abgebrochen, nachdem die aktuelle Anfrage endet:

%Vor%

2. Für Web-Formulare - verwenden Sie BackgroundWorker in Kombination mit dem Seitenattribut "Async"

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%

3. Wenn Sie .NET 4.5.2 oder höher verwenden, verwenden Sie einfach 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

    
Alex 06.05.2014, 19:30
quelle
4

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:

Stapelüberlauf Frage zu lang Jobs in IIS laufen

Die Gefahren von Hintergrundaufgaben in asp.net

    
cost 05.05.2014 22:54
quelle
2

ASP.NET-WebForms

Eine andere Lösung bieten: Sie nicht müssen Ihre Seite mit der Eigenschaft async festlegen. Der folgende Code funktioniert gut:

%Vor%

In diesem Code verhindert IsBackground = true , dass der Thread abgebrochen wird, wenn die Anfrage beendet ist.

    
Zanon 02.05.2016 21:11
quelle
0

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%     
Tough Coder 06.05.2014 15:35
quelle

Tags und Links