So löschen Sie alle threads gestartet, die innerhalb einer Anwendung?
Ich habe eine WPF-Anwendung, die verwendet viele Fremdanbieter-DLLs, die in Ihren eigenen threads.
Einige dieser DLLs Methode STOP()
.
Ich bin mit Thread.Sleep(1000)
nach jedem SomeObject.Stop()
Methode...
Sowieso, wenn ich zum beenden der Anwendung einige der threads sind noch im Speicher.
Keine Ahnung, wie dieses problem zu beheben?
- Was macht Sie sagen, Sie sind im Speicher, wenn die Anwendung beendet wird? Nichts ist in der Erinnerung dann. Sind Sie Fragen, weil diese Drittanbieter-dlls sind keine hintergrund-threads und verhindern anmutig Anwendung Ende?
- Ja ja. wenn ich in der Nähe meiner WPF-Anwendung bin ich vor einigen threads unter dem TaskManager.
- Check stackoverflow.com/questions/5002279/...
- Warum ist das ein problem?
- Wenn Sie die Anwendung beendet(also den Prozess), kein Gewinde, wird überleben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Grundsätzlich haben Sie also vor einem Problem mit 3rd-party-Bibliothek, die nicht gut säubern, wenn es sein sollte, und oben auf, dass seine gesponnen, bis eine Reihe von Vordergrund-threads halten, Ihre Anwendung laufen, selbst wenn Sie es beendet.
Beispiel
Als ein Beispiel, eine Anwendung wie diese
Sitzen ewig da
t
ist ein Vordergrund-thread.Lasst uns einfach double check mit dem process explorer. Hier ist eine aktualisierte version unserer demo-app, die wir pinvoke und erhalten die native thread-id.
Gibt mir die native thread-id. Im Prozess explorer kann ich jetzt sehen:
Ziemlich klar, dass der thread 8228 dreht sich wie Wild, weil meine while-Schleife, obwohl main hat bereits beendet
In general, Benutzer Rob Hardy ist richtig. Wenn Sie Steuern Ihre threads sollte man immer behalten und Sie verwalten sich selbst, aber ich denke, du bist in einer Gurke hier, da Sie nicht über Zugriff auf die thread-handles.
Option 1 (aber bitte nicht)
Können Sie versuchen, und alles töten (aber das hat nicht wirklich Arbeit für mich, wenn ich versuchte es trotzdem), aber ich habe wirklich nicht mehr tun würde dies, da es scheint unglaublich gefährlich, das zu tun. Nur kopieren Sie die Informationen aus dem anderen post das Beispiel, sagte dieser:
Aber wieder, , die nicht aufhören, den Prozess für mich. Vielleicht .Netto ist das warten für eine ordnungsgemäße beenden des threads und nicht nur energisch nativen beendet? Ich weiß es nicht. Bin ich nur zeigen, dass man technisch (laut dem link) kann töten-threads von
ProcessThread
, wenn Sie WIRKLICH wollte (aber bitte nicht)Option 2
Vernünftige option ist, um eine explizite
Exit
Anruf mit einem code, nachdem alle Ihre Bereinigung (exit-code 0 ist üblich, um anzuzeigen, dass ein sauberes beenden)Dieser arbeitete für mich.
Option 3
Die Dritte option, wenn Sie können, wird nur fix die Bibliothek und haben es entweder erstellen von hintergrund-threads oder lass es mal richtig Aufräumen. Das wäre die beste option, da Sie nicht verlassen werden alle möglichen vergänglichen Nebenwirkungen zu öffnen, durch nicht die Reinigung der 3rd-party-Elemente. Obwohl, ich gehe davon aus, dass Sie dieses nicht tun, weil die Bibliothek ist closed source.
Verfolgen Sie Ihre Themen, indem Sie Sie zu einer Sammlung, oder verwenden Sie die
ThreadPool
In jedem thread stellen Sie sicher, dass Sie mit der
ThreadAbortException
An der Abbruchstelle am Ende Ihrer
Main()
, gehen Sie durch Ihre Sammlung von Threads und rufenAbort()
auf jeden.ProcessThread
s.