Thread.Abort Metoda

Definicja

ThreadAbortException Wywołuje element w wątku, na którym jest wywoływany, aby rozpocząć proces kończenie wątku. Wywołanie tej metody zwykle kończy wątek.

Przeciążenia

Abort()
Przestarzałe.

ThreadAbortException Wywołuje element w wątku, na którym jest wywoływany, aby rozpocząć proces kończenie wątku. Wywołanie tej metody zwykle kończy wątek.

Abort(Object)
Przestarzałe.

ThreadAbortException Wywołuje element w wątku, na którym jest wywoływany, aby rozpocząć proces kończenia wątku, a jednocześnie dostarcza informacje o wyjątkach na temat zakończenia wątku. Wywołanie tej metody zwykle kończy wątek.

Uwagi

Ważne

Należy zachować ostrożność przy Thread.Abort użyciu metody . Szczególnie w przypadku wywołania go w celu przerwania wątku innego niż bieżący wątek nie wiadomo, jaki kod został wykonany lub nie można go wykonać po ThreadAbortException wyświetleniu. Nie można również mieć pewności stanu aplikacji ani jakiejkolwiek aplikacji i stanu użytkownika, który jest odpowiedzialny za zachowanie. Na przykład wywołanie Thread.Abort może uniemożliwić wykonywanie konstruktorów statycznych lub zwolnienie zarządzanych lub niezarządzanych zasobów.

Abort()

Źródło:
Thread.cs
Źródło:
Thread.cs
Źródło:
Thread.cs

Przestroga

Thread.Abort is not supported and throws PlatformNotSupportedException.

ThreadAbortException Wywołuje element w wątku, na którym jest wywoływany, aby rozpocząć proces kończenie wątku. Wywołanie tej metody zwykle kończy wątek.

public:
 void Abort();
[System.Obsolete("Thread.Abort is not supported and throws PlatformNotSupportedException.", DiagnosticId="SYSLIB0006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public void Abort ();
public void Abort ();
[<System.Obsolete("Thread.Abort is not supported and throws PlatformNotSupportedException.", DiagnosticId="SYSLIB0006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
member this.Abort : unit -> unit
member this.Abort : unit -> unit
Public Sub Abort ()
Atrybuty

Wyjątki

Tylko platformy .NET Core i .NET 5+: we wszystkich przypadkach.

Obiekt wywołujący nie posiada wymaganych uprawnień.

Wątek, który jest przerywany, jest obecnie zawieszony.

Uwagi

Ta metoda jest przestarzała. Na platformie .NET 5 i nowszych wersjach wywołanie tej metody powoduje wygenerowanie ostrzeżenia w czasie kompilacji. Ta metoda zgłasza błąd PlatformNotSupportedException w czasie wykonywania na platformie .NET 5 i nowszych wersjach oraz na platformie .NET Core.

Gdy ta metoda jest wywoływana w wątku, system zgłasza wątek, ThreadAbortException aby go przerwać. ThreadAbortException jest specjalnym wyjątkiem, który można przechwycić za pomocą kodu aplikacji, ale jest ponownie zgłaszany na końcu catch bloku, chyba że ResetAbort zostanie wywołany. ResetAbort anuluje żądanie przerwania i uniemożliwia ThreadAbortException zakończenie wątku. Nieskonseksowane finally bloki są wykonywane przed przerwanie wątku.

Uwaga

Gdy wątek wywołuje Abort się samodzielnie, efekt jest podobny do zgłaszania wyjątku; ThreadAbortException dzieje się to natychmiast, a wynik jest przewidywalny. Jeśli jednak jeden wątek wywołuje Abort inny wątek, przerwanie przerywa działanie dowolnego kodu. Istnieje również prawdopodobieństwo przerwania konstruktora statycznego. W rzadkich przypadkach może to uniemożliwić tworzenie wystąpień tej klasy w tej domenie aplikacji.

Wątek nie gwarantuje natychmiastowego przerwania lub w ogóle. Taka sytuacja może wystąpić, jeśli wątek wykonuje niezwiązaną ilość obliczeń w finally blokach, które są wywoływane w ramach procedury przerwania, co powoduje nieokreślone opóźnienie przerwania. Aby poczekać na przerwanie wątku, można wywołać Join metodę w wątku po wywołaniu Abort metody, ale nie ma gwarancji, że oczekiwanie zakończy się.

Uwaga

Wątek wywołujący Abort może blokować, jeśli przerwany wątek znajduje się w chronionym regionie kodu, takim jak catch blok, finally blok lub ograniczony region wykonywania. Jeśli wątek, który wywołuje Abort blokadę wymaganą przez przerwany wątek, może wystąpić zakleszczenie.

Jeśli Abort jest wywoływany w wątku, który nie został uruchomiony, wątek zostanie przerwany po Start wywołaniu. Jeśli Abort jest wywoływany w wątku, który jest zablokowany lub jest spany, wątek zostanie przerwany, a następnie przerwany.

Jeśli Abort jest wywoływany w wątku, który został zawieszony, ThreadStateException element jest zgłaszany w wątku o nazwie Aborti AbortRequested jest dodawany do ThreadState właściwości przerywanego wątku. Element ThreadAbortException nie jest zgłaszany w zawieszonym wątku, dopóki Resume nie zostanie wywołany.

Jeśli Abort jest wywoływany w zarządzanym wątku podczas wykonywania niezarządzanego kodu, ThreadAbortException element nie jest zgłaszany, dopóki wątek nie powróci do kodu zarządzanego.

Jeśli dwa wywołania przyjść Abort w tym samym czasie, możliwe jest, aby jedno wywołanie ustawiło informacje o stanie, a drugie wywołanie do wykonania Abort. Jednak aplikacja nie może wykryć tej sytuacji.

Po Abort wywołaniu wątku stan wątku obejmuje element AbortRequested. Po zakończeniu wątku w wyniku pomyślnego wywołania do Abortelementu stan wątku zostanie zmieniony na Stopped. Przy wystarczających uprawnieniach wątek, który jest obiektem docelowym obiektu Abort , może anulować przerwanie przy użyciu ResetAbort metody . Przykład przedstawiający wywoływanie ResetAbort metody można znaleźć w ThreadAbortException klasie .

Zobacz też

Dotyczy

Abort(Object)

Źródło:
Thread.cs
Źródło:
Thread.cs
Źródło:
Thread.cs

Przestroga

Thread.Abort is not supported and throws PlatformNotSupportedException.

ThreadAbortException Wywołuje element w wątku, na którym jest wywoływany, aby rozpocząć proces kończenia wątku, a jednocześnie dostarcza informacje o wyjątkach na temat zakończenia wątku. Wywołanie tej metody zwykle kończy wątek.

public:
 void Abort(System::Object ^ stateInfo);
[System.Obsolete("Thread.Abort is not supported and throws PlatformNotSupportedException.", DiagnosticId="SYSLIB0006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public void Abort (object? stateInfo);
public void Abort (object stateInfo);
public void Abort (object? stateInfo);
[<System.Obsolete("Thread.Abort is not supported and throws PlatformNotSupportedException.", DiagnosticId="SYSLIB0006", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
member this.Abort : obj -> unit
member this.Abort : obj -> unit
Public Sub Abort (stateInfo As Object)

Parametry

stateInfo
Object

Obiekt, który zawiera informacje specyficzne dla aplikacji, takie jak stan, który może być używany przez przerwany wątek.

Atrybuty

Wyjątki

Tylko platformy .NET Core i .NET 5+: we wszystkich przypadkach.

Obiekt wywołujący nie posiada wymaganych uprawnień.

Wątek, który jest przerywany, jest obecnie zawieszony.

Przykłady

Poniższy przykład kodu przedstawia sposób przekazywania informacji do wątku, który jest przerywany.

using namespace System;
using namespace System::Threading;
ref class Test
{
private:
   Test(){}


public:
   static void TestMethod()
   {
      try
      {
         while ( true )
         {
            Console::WriteLine( "New thread running." );
            Thread::Sleep( 1000 );
         }
      }
      catch ( ThreadAbortException^ abortException ) 
      {
         Console::WriteLine( dynamic_cast<String^>(abortException->ExceptionState) );
      }

   }

};

int main()
{
   Thread^ newThread = gcnew Thread( gcnew ThreadStart( &Test::TestMethod ) );
   newThread->Start();
   Thread::Sleep( 1000 );
   
   // Abort newThread.
   Console::WriteLine( "Main aborting new thread." );
   newThread->Abort( "Information from main." );
   
   // Wait for the thread to terminate.
   newThread->Join();
   Console::WriteLine( "New thread terminated - main exiting." );
}
using System;
using System.Threading;

class Test
{
    public static void Main()
    {
        Thread newThread  = new Thread(new ThreadStart(TestMethod));
        newThread.Start();
        Thread.Sleep(1000);

        // Abort newThread.
        Console.WriteLine("Main aborting new thread.");
        newThread.Abort("Information from Main.");

        // Wait for the thread to terminate.
        newThread.Join();
        Console.WriteLine("New thread terminated - Main exiting.");
    }

    static void TestMethod()
    {
        try
        {
            while(true)
            {
                Console.WriteLine("New thread running.");
                Thread.Sleep(1000);
            }
        }
        catch(ThreadAbortException abortException)
        {
            Console.WriteLine((string)abortException.ExceptionState);
        }
    }
}
open System.Threading

let testMethod () =
    try
        while true do
            printfn "New thread running."
            Thread.Sleep 1000
    with :? ThreadAbortException as abortException ->
        printfn $"{abortException.ExceptionState :?> string}"

let newThread = Thread testMethod
newThread.Start()
Thread.Sleep 1000

// Abort newThread.
printfn "Main aborting new thread."
newThread.Abort "Information from Main."

// Wait for the thread to terminate.
newThread.Join()
printfn "New thread terminated - Main exiting."
Imports System.Threading

Public Class Test

    <MTAThread> _
    Shared Sub Main()
        Dim newThread As New Thread(AddressOf TestMethod)
        newThread.Start()
        Thread.Sleep(1000)

        ' Abort newThread.
        Console.WriteLine("Main aborting new thread.")
        newThread.Abort("Information from Main.")

        ' Wait for the thread to terminate.
        newThread.Join()
        Console.WriteLine("New thread terminated - Main exiting.")
    End Sub

    Shared Sub TestMethod()
        Try
            While True
                Console.WriteLine("New thread running.")
                Thread.Sleep(1000)
            End While
        Catch abortException As ThreadAbortException
            Console.WriteLine( _
                CType(abortException.ExceptionState, String))
        End Try
    End Sub

End Class

Uwagi

Ta metoda jest przestarzała. Na platformie .NET 5 i nowszych wersjach wywołanie tej metody powoduje wygenerowanie ostrzeżenia w czasie kompilacji. Ta metoda zgłasza błąd PlatformNotSupportedException w czasie wykonywania na platformie .NET 5 i nowszych wersjach oraz na platformie .NET Core.

Gdy ta metoda jest wywoływana w wątku, system zgłasza wątek, ThreadAbortException aby go przerwać. ThreadAbortException jest specjalnym wyjątkiem, który można przechwycić za pomocą kodu aplikacji, ale jest ponownie zgłaszany na końcu catch bloku, chyba że ResetAbort zostanie wywołany. ResetAbort anuluje żądanie przerwania i uniemożliwia ThreadAbortException zakończenie wątku. Nieskonseksowane finally bloki są wykonywane przed przerwanie wątku.

Uwaga

Gdy wątek wywołuje Abort się samodzielnie, efekt jest podobny do zgłaszania wyjątku; ThreadAbortException dzieje się to natychmiast, a wynik jest przewidywalny. Jeśli jednak jeden wątek wywołuje Abort inny wątek, przerwanie przerywa działanie dowolnego kodu. Istnieje szansa, że konstruktor statyczny może zostać przerwany. W rzadkich przypadkach może to uniemożliwić tworzenie wystąpień tej klasy w tej domenie aplikacji.

Wątek nie gwarantuje natychmiastowego przerwania lub w ogóle. Taka sytuacja może wystąpić, jeśli wątek wykonuje niezwiązaną ilość obliczeń w finally blokach, które są wywoływane w ramach procedury przerwania, co powoduje nieokreślone opóźnienie przerwania. Aby poczekać na przerwanie wątku, można wywołać Join metodę w wątku po wywołaniu Abort metody, ale nie ma gwarancji, że oczekiwanie zakończy się.

Uwaga

Wątek wywołujący Abort może blokować, jeśli przerwany wątek znajduje się w chronionym regionie kodu, takim jak catch blok, finally blok lub ograniczony region wykonywania. Jeśli wątek, który wywołuje Abort blokadę wymaganą przez przerwany wątek, może wystąpić zakleszczenie.

Jeśli Abort jest wywoływany w wątku, który nie został uruchomiony, wątek zostanie przerwany po Start wywołaniu. Jeśli Abort jest wywoływany w wątku, który jest zablokowany lub jest spany, wątek zostanie przerwany, a następnie przerwany.

Jeśli Abort jest wywoływany w wątku, który został zawieszony, ThreadStateException element jest zgłaszany w wątku o nazwie Aborti AbortRequested jest dodawany do ThreadState właściwości przerywanego wątku. Element ThreadAbortException nie jest zgłaszany w zawieszonym wątku, dopóki Resume nie zostanie wywołany.

Jeśli Abort jest wywoływany w zarządzanym wątku podczas wykonywania niezarządzanego kodu, ThreadAbortException element nie jest zgłaszany, dopóki wątek nie powróci do kodu zarządzanego.

Jeśli dwa wywołania przyjść Abort w tym samym czasie, możliwe jest, aby jedno wywołanie ustawiło informacje o stanie, a drugie wywołanie do wykonania Abort. Jednak aplikacja nie może wykryć tej sytuacji.

Po Abort wywołaniu wątku stan wątku obejmuje element AbortRequested. Po zakończeniu wątku w wyniku pomyślnego wywołania do Abortelementu stan wątku zostanie zmieniony na Stopped. Przy wystarczających uprawnieniach wątek, który jest obiektem docelowym obiektu Abort , może anulować przerwanie przy użyciu ResetAbort metody . Przykład przedstawiający wywoływanie ResetAbort metody można znaleźć w ThreadAbortException klasie .

Zobacz też

Dotyczy