"Undichte" Gewindegriffe

8

Ich habe eine WCF-Anwendung in IIS gehostet (geschrieben in C#/.Net 4 ). Mit der Zeit nimmt die Anzahl der Handle des Prozesses mehr oder weniger linear zu (bis zu 30.000, bevor der Prozess recycelt wird). Laut SysInternals Process Explorer hat der Großteil der Handles, die der Prozess hat, den Typ Thread . Laut Systemmonitor bleibt die Anzahl der Threads jedoch mehr oder weniger konstant (etwa 40).

Klar, ich mache etwas falsch und lecke Thread Handles . Allerdings ist mir unklar, was genau ein Thread Handle in diesem Zusammenhang ist. Ich hätte angenommen, dass es ein Handle zu einem Thread ist, aber da die Anzahl der Threads konsistent bleibt, sehe ich nicht, wie die Anzahl der Handle immer zunimmt. Und ich kann mir keinen Weg vorstellen, den Faden zu behalten, während der Faden selbst verschwindet. Außerdem erstelle ich nicht explizit neue Threads (ich verwende ThreadPool an einigen Stellen).

Klar, ich vermisse etwas. Aber was?

    
David Mullin 11.12.2012, 19:33
quelle

2 Antworten

1

Man kann Handles zu beendeten Threads haben. So werden die Threads erstellt, terminiert, aber der Handle bleibt erhalten.

Starten Sie den Prozessmonitor (procmon.exe) und stellen Sie ihn so ein, dass er auf "Prozess- und Threadaktivität" hört (Dateien, Registrierung und Netzwerk deaktivieren). Ermitteln Sie, wer Threads erstellt, indem Sie auf Ereignisse zum Erstellen von Threads doppelklicken und den Stack betrachten.

Das sollte die Frage beantworten, wer die Threads erstellt. Er ist verantwortlich für das Schließen der Griffe.

    
usr 14.12.2012 11:10
quelle
0

Laut Dokumentation :

  

Wenn ein neuer Thread von CreateThread oder CreateRemoteThread Funktion, wird ein Handle zum Thread zurückgegeben.

Wenn Sie also so viele Griffe haben, erzeugt Ihre Anwendung ständig neue Threads. Auf der anderen Seite besagt die nahezu konstante Anzahl von Threads im Systemmonitor, dass Threads anstelle von recycelten Threads erstellt werden.

ThreadPool Klassendokumentation:

  

Beginnend mit .NET Framework 4 erstellt und löscht der Threadpool Worker-Threads, um den Durchsatz zu optimieren . Dieser Wert wird als die Anzahl der Aufgaben definiert, die pro Zeiteinheit abgeschlossen werden. Zu wenige Threads können die verfügbaren Ressourcen nicht optimal nutzen, während zu viele Threads den Ressourcenkonflikt erhöhen könnten.

Also ich denke, Ihr Anwendungsverhalten ist wegen der ThreadPool .

    
VMAtm 14.12.2012 09:36
quelle