HOWTO · Csharp

So beenden Sie einen Thread in C#

In diesem Artikel erfahren Sie, wie Sie einen Thread in C# starten und stoppen.

Auf dieser Seite

Wenn eine C#-Anwendung einen mit Thread erstellten Worker beenden muss, kann die veraltete Methode Abort() die Laufzeit auffordern, ihn zu beenden. Diese Technik gilt nur für Runtimes, die Thread.Abort() unterstützen; moderne .NET-Runtimes lösen stattdessen möglicherweise PlatformNotSupportedException aus. Für neuen Code ist die kooperative Abbruchbehandlung mit einem CancellationToken in der Regel sicherer, weil der Worker Ressourcen freigeben und gemeinsam genutzte Zustände in einen definierten Zustand versetzen kann.

Auf einer unterstützten Runtime löst Abort() im Zielthread eine ThreadAbortException aus. Die Ausnahme tritt asynchron auf, sodass der Worker unterbrochen werden kann, während er eine Sperre hält oder gemeinsam genutzte Daten aktualisiert. Betrachten Sie dieses Beispiel als Kompatibilitätsreferenz und verwenden Sie es nur, wenn die Ziel-Runtime die API ausdrücklich unterstützt.

Verwenden Sie die Methode Abort(), um einen Thread in C# zu stoppen

Die Dokumentation zu Thread.Abort() beschreibt die Runtime-Unterstützung für diesen veralteten Vorgang. Der Namespace System.Threading enthält den Typ Thread sowie seine Methoden Start() und Abort(). Das vollständige Beispiel unten definiert ThreadDemo.threadAssign(), erstellt eine Klasse ThreadExampleMain mit Main(), startet den Worker und fordert ihn zum Beenden auf.

Die Schleife ist auf sechs Iterationen, nicht auf vier, eingestellt. Die Zeile Thread is abort wird unmittelbar vor der Abbruchanforderung ausgegeben und ist daher nur eine Diagnosemeldung; sie beweist nicht, dass der Worker angehalten wurde.

Der folgende eigenständige Quellcode erstellt den Worker, startet ihn, fordert sein Beenden an und wartet auf den Worker:

using System;
using System.Threading;

public class ThreadDemo {
  public void threadAssign() {
    for (int threadCount = 0; threadCount < 6; threadCount++) {
      Console.WriteLine("First Thread");
      Thread.Sleep(10);
    }
  }
}

public class ThreadExampleMain {
  public static void Main() {
    ThreadDemo threadDemo = new ThreadDemo();
    Thread thread = new Thread(new ThreadStart(threadDemo.threadAssign));
    thread.Start();
    Console.WriteLine("Thread is abort");
    try {
      thread.Abort();
    }
    catch (PlatformNotSupportedException) {
      Console.WriteLine("Abort() is not supported by this runtime.");
    }
    thread.Join();
  }
}
Thread is abort
First Thread

Die mitgelieferte Ausführungsevidenz dokumentiert einen abgeschlossenen Lauf dieses Quelltexts. Sie bestätigt, dass Thread is abort vor der Abbruchanforderung ausgegeben wird; die Reihenfolge und Anzahl der Zeilen mit First Thread hängen von der Threadplanung ab, daher ist kein festes Protokoll zu erwarten. Führen Sie den Code auf der von Ihnen eingesetzten Runtime aus, bevor Sie sich auf sein Verhalten verlassen.

Auf einer Runtime, die Abort() unterstützt, empfängt der Worker die asynchrone ThreadAbortException und wird beendet. Dies unterscheidet sich von einer Ausnahme, die Abort() in Main() synchron auslöst. Die genaue Reihenfolge und Anzahl der Zeilen mit First Thread vor der Abbruchanforderung hängt von der Threadplanung ab; die Schleife selbst erlaubt sechs Iterationen. Wenn Abort() PlatformNotSupportedException auslöst, kann der Worker weiterlaufen und der catch-Zweig meldet diesen synchronen Fehler; die Meldung ist eine Diagnose und kein Beweis dafür, dass die Runtime in jedem Kontext keine Unterstützung bietet. Verwenden Sie in keinem Fall die Zeile Thread is abort als Beleg für die Beendigung. Nach beiden Pfaden wartet thread.Join(), bis der Worker beendet ist, bevor Main() zurückkehrt; wenn Abort() nicht unterstützt wird, bedeutet das, dass gewartet wird, bis der Worker normal abgeschlossen ist.