Handle-Lecks mit .NET System.Threading.Thread Klasse
-
04-10-2019 - |
Frage
Ich habe ein Problem, dass Anzahl der Griffe in meiner app kontinuierlich wächst. Ich habe das Debuggen und zu erkennen, dass dies durch System.Threading.Thread Klasse verursacht wird, die für einige Routine verwendet wird. Zur Vereinfachung der Fehlersuche Ich habe eine Probe .NET-Anwendung erstellt:
...
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(DoWork);
t.Start();
}
public void DoWork(object parameter)
{
// Do something...
}
...
Jedes Mal, wenn ich auf die Schaltfläche bin klicken, wird ein Thread erstellt System.Threading.Thread Klasse. Das Problem ist, dass sieht aus wie der Faden nicht frees Griffe, weil jeder Klick Ursache Anzahl der Griffe von ~ 5 wächst.
Die Frage ist: Wie kann ich manuell alle Griffe von System.Threading.Thread Klasse erstellt frei
Vielen Dank im Voraus.
Lösung
Es ist nicht eigentlich die Griffe undicht, es ist nur, dass der GC hat sie noch nicht gesammelt. Versuchen Sie den Code in der Schaltfläche Handler ändern, dass er Schleifen und schafft 500 Fäden oder etwas und versuchen Sie es ein paar Mal drücken und Sie werden wahrscheinlich sehen Griffe gesammelt werden.
Andere Tipps
Es ist ein Fehler in der CLR
Sie müssen nicht manuell Ihre Thread-Handles befreien, einfach alle Verweise auf Ihre Thread
Instanz fallen sollte ausreichen. Da der Faden nicht mehr läuft und alle Verweise darauf werden entfernt, der gargabe Kollektor wird die Griffe auf der nächsten Sammlung befreien.
In Ihrem Fall, es sieht nicht wie der Thread wird immer beenden.