So brechen Sie Threads ab, die mit ThreadPool.QueueUserWorkItem erstellt wurden

StackOverflow https://stackoverflow.com/questions/26816

  •  09-06-2019
  •  | 
  •  

Frage

Gibt es eine Möglichkeit, mit QueueUserWorkItem erstellte Threads abzubrechen?

Oder muss ich das vielleicht auch nicht?Was passiert, wenn die Hauptanwendung beendet wird?Werden alle daraus erstellten Threads automatisch abgebrochen?

War es hilfreich?

Lösung

Sie müssen sie nicht abbrechen.Wenn Ihre Anwendung beendet wird, beendet .NET alle Threads mit IsBackground = true.Im .NET-Threadpool sind alle Threads auf IsBackground = true gesetzt, Sie müssen sich also keine Sorgen machen.

Wenn Sie nun Threads erstellen, indem Sie die Thread-Klasse neu erstellen, müssen Sie sie entweder abbrechen oder ihre IsBackground-Eigenschaft auf true setzen.

Andere Tipps

Wenn Sie jedoch nicht verwaltete Ressourcen in diesen Threads verwenden, können Sie in eine Menge Ärger geraten.

Das würde eher davon abhängen, wie Sie sie verwenden. Wenn diese nicht verwalteten Ressourcen ordnungsgemäß verpackt wären, würden sie durch ihre Wrapper-Finalisierung behandelt, unabhängig von dem Mechanismus, der zum Beenden von Threads verwendet wird, die auf sie verwiesen haben. Und nicht verwaltete Ressourcen werden vom Betriebssystem ohnehin freigegeben, wenn eine App beendet wird.

Es besteht die allgemeine Meinung, dass (Windows-)Anwendungen viel zu viel Zeit damit verbringen, beim Herunterfahren der App zu bereinigen – oft mit dem Einlagern großer Speichermengen, nur damit dieser wieder verworfen werden kann (oder mit dem Einlagern von Code, der herumläuft). Freigeben nicht verwalteter Objekte, mit denen das Betriebssystem sowieso umgehen würde).

Der Threadpool verwendet Hintergrundthreads.Daher werden sie alle automatisch geschlossen, wenn die Anwendung beendet wird.

Wenn Sie einen Thread selbst abbrechen möchten, müssen Sie den Thread entweder selbst verwalten (damit Sie Thread.Abort() für das Thread-Objekt aufrufen können) oder Sie müssen einen Benachrichtigungsmechanismus einrichten, der dies ermöglicht Sagen Sie dem Thread, dass er sich selbst abbrechen soll.

Ja sie werden.Wenn Sie in diesen Threads jedoch nicht verwaltete Ressourcen verwenden, kann es zu großen Problemen kommen.

Ja, sie sind im Hintergrund, aber wenn Sie beispielsweise eine Anwendung haben, in der Sie ThreadPool für mehrere Downloads oder ähnliches verwenden, und Sie sie stoppen möchten, wie stoppen Sie das?mein Vorschlag wäre:Verlasse den Thread so schnell wie möglich, z.B

bool stop = false;
void doDownloadWork(object s) 
{
   if (!stop)
   {
       DownloadLink((String)s, location);
   }
}

und wenn Sie stop = true setzen, werden zweite (derzeit in der Warteschlange befindliche) Threads automatisch beendet, nachdem die Warteschlangen-Threads den Prozess abgeschlossen haben.

Laut der Antwort von Lukas Šalkauskas.

Aber Sie sollten Folgendes verwenden:

volatile bool stop = false;

um dem Compiler mitzuteilen, dass diese Variable von mehreren Threads verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top