Meine zwei Cent für die Thread.Abort- und Thread.Interrupt-Methoden

In C # müssen Sie möglicherweise häufig einen blockierten Thread freigeben. Um dies zu erreichen, gibt es zwei Methoden, die Sie nutzen können. Dazu gehören die Methoden Thread.Abort und Thread.Interrupt.

Was macht die Thread.Abort-Methode?

Um einen Thread zu beenden, können Sie die Abort-Methode der Thread-Klasse verwenden. Beachten Sie, dass die Abort-Methode der Thread-Klasse beim Aufrufen eine ThreadAbortException in dem Thread auslöst, in dem sie aufgerufen wurde, um den Prozess zum Beenden eines Threads zu starten. Es ist zu beachten, dass Sie die Abort-Methode der Thread-Klasse nutzen können, um auch einen nicht blockierten Thread zu beenden. Wenn sich der zu unterbrechende Thread in einem Wartezustand befindet, wird er aktiviert und eine ThreadInterruptedException ausgelöst. Wenn Sie die Thread.Abort-Methode für einen Thread aufrufen, der sich im Wartezustand befindet, weckt die Laufzeit den Thread auf und löst dann eine ThreadAbortException aus.

Sie können die ThreadAbortException im catch-Block abfangen. Wenn Sie die ResetAbort-Methode jedoch nicht aufrufen, wird diese Ausnahme am Ende des catch-Blocks erneut ausgelöst. Der Aufruf der ResetAbort-Methode verhindert, dass die ThreadAbortException am Ende des catch-Blocks erneut ausgelöst wird. Im Gegensatz zur Funktionsweise der Thread.Inturrupt-Methoden löst die Thread.Abort-Methode eine ThreadAbortException für den Thread aus, wenn der Thread, für den die Thread.Abort-Methode aufgerufen wird, nicht blockiert ist.

In den meisten Fällen (es sei denn, Sie möchten die Anwendungsdomäne nach dem Abbruch eines Threads herunterfahren) müssen Sie diese Methode überhaupt nicht verwenden. Beachten Sie, dass die Response.Redirect-Methode in ASP.Net eine ThreadAbortException auslöst.

Was ist der Zweck der Thread.Interrupt-Methode?

Mit der Thread.Interrupt-Methode können Sie einen Thread unterbrechen, der sich im Status WaitSleepJoin befindet. Keiner dieser Ansätze (Thread.Abort- oder Thread.Interrupt-Methodenaufrufe) ist jedoch threadsicher. Während die Thread.Abort-Methode eine ThreadAbortException auslöst, löst die Thread.Interrupt-Methode eine ThreadInterruptException aus. Im Wesentlichen unterbricht ein Aufruf der Thread.Interrupt-Methode den Thread und löst eine ThreadInterruptedException aus, um den Thread innerhalb eines blockierenden Aufrufs zu unterbrechen. Sie sollten diese Ausnahme in Ihrem Code behandeln, bei dem die Laufzeit den Thread stoppen würde, für den die Thread.Interrupt-Methode aufgerufen wurde. Es ist zu beachten, dass ein Aufruf von Thread.Interrupt einen Thread nicht unterbricht, der nicht verwalteten Code ausführt.

Betrachten Sie die folgende Codeliste, die veranschaulicht, wie die Thread.Interrupt-Methode zwangsweise aufgerufen werden kann, um einen Thread zu unterbrechen.

static void Main(string[] args)

       {

           Thread thread = new Thread(ThreadMethod);

           thread.Start();

           thread.Interrupt();

           Console.Read();

       }

       private static void ThreadMethod()

       {

           try

           {

               Thread.Sleep(Timeout.Infinite);

           }

           catch (ThreadInterruptedException)

           {

             Console.Write("ThreadInterruptedException has been called forcibly.");

           }

       }

Wenn das obige Programm ausgeführt wird, wird in der Konsole die Meldung "ThreadInterruptedException wurde gewaltsam aufgerufen" angezeigt.

Was passiert, wenn der unterbrochene Thread nicht blockiert wird? Wenn Sie Thread aufrufen. Wenn Sie einen Thread blockieren, der nicht blockiert ist, wird der Thread so lange ausgeführt, bis er das nächste Mal blockiert wird. In den meisten Fällen müssen Sie Thread.Interrupt überhaupt nicht verwenden. Sie können dasselbe mit Signalisierungskonstrukten oder Stornierungs-Token erreichen.

Soll ich die Thread.Abort- oder die Thread.Interrupt-Methode verwenden?

Wann sollte ich Thread.Abort vs Thread.Interrupt-Methoden in meinem Programm verwenden? Welche dieser Methoden sollte ich verwenden, wenn ich einen bestimmten Vorgang abbrechen muss? Meine ehrliche Antwort ist, dass Sie niemals eine dieser Methoden verwenden sollten, um einen Thread zu beenden. Es wird empfohlen, keine Thread.Abort- oder Thread.Interrupt-Methoden zum Beenden eines Threads zu verwenden. Sie sollten lieber Synchronisationsobjekte (wie WaitHandles oder Semaphoren) nutzen und die von Ihnen verwendeten Threads ordnungsgemäß beenden. Das folgende Codeausschnitt zeigt, wie Sie ein WaitHandle nutzen können, damit ein Thread ordnungsgemäß gestoppt werden kann.

private void ThreadMethod()

{

   while(!manualResetEventObject.WaitOne(TimeSpan.FromMilliseconds(100)))

   {

       //Write your code here

   }

}

Als alternative Methode zum ordnungsgemäßen Beenden eines Threads können Sie auch eine flüchtige "boolesche" Variable verwenden. Sie können diese Variable dann im UI-Thread für eine Benutzeraktivität festlegen (vorausgesetzt, der Benutzer hat in der UI auf die Schaltfläche "Abbrechen" geklickt, um den Thread zu beenden) und dann von Zeit zu Zeit den Wert der Variablen im Worker überprüfen Thread, um zu sehen, ob die Variable in der Benutzeroberfläche festgelegt wurde (möglicherweise der Wert "false", um die Beendigung des Threads anzuzeigen).