Udostępnij za pośrednictwem


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

Nazwa Opis
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żna

Thread.Abort Użyj metody z ostrożnością. 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 wykonać go ThreadAbortException po wyświetleniu. Nie można również mieć pewności co do stanu swojej aplikacji ani stanu aplikacji i użytkownika, za którego zachowanie jest odpowiedzialna aplikacja. Na przykład wywołanie Thread.Abort może uniemożliwić wykonanie konstruktorów statycznych lub zwolnienie zarządzanych albo niezarządzanych zasobów.

Abort()

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

Uwaga

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 ma wymaganych uprawnień.

Przerywany wątek jest obecnie zawieszony.

Uwagi

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

Gdy ta metoda jest wywoływana w wątku, system zgłasza ThreadAbortException element w wątku, aby go przerwać. ThreadAbortException jest specjalnym wyjątkiem, który może zostać przechwycony przez kod aplikacji, ale jest zgłaszany ponownie na końcu catch bloku, chyba że ResetAbort jest wywoływany. ResetAbort Anuluje żądanie przerwania i uniemożliwia ThreadAbortException zakończenie wątku. Nieskonseksowane finally bloki są wykonywane przed przerwanie wątku.

Uwaga / Notatka

Gdy wątek wywołuje Abort się samodzielnie, efekt jest podobny do zgłaszania wyjątku; ThreadAbortException występuje 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 ani 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, tym samym przez czas nieokreślony opóźniając przerwanie. Aby poczekać na przerwanie wątku, możesz wywołać Join metodę w wątku po wywołaniu Abort metody, ale nie ma gwarancji, że oczekiwanie zakończy się.

Uwaga / Notatka

Wątek, który wywołuje 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 element 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 A 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 pochodzą Abort w tym samym czasie, możliwe jest, aby jedno wywołanie ustawiło informacje o stanie i drugie wywołanie w celu wykonania Abort. Jednak aplikacja nie może wykryć tej sytuacji.

Po Abort wywołaniu w wątku stan wątku obejmuje .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 celem obiektu Abort docelowego, 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
Źródło:
Thread.cs
Źródło:
Thread.cs

Uwaga

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 zawierający informacje specyficzne dla aplikacji, takie jak stan, który może być używany przez przerywany wątek.

Atrybuty

Wyjątki

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

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

Przerywany wątek jest obecnie zawieszony.

Przykłady

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

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 lub nowszych wersjach wywołanie tej metody powoduje wygenerowanie ostrzeżenia w czasie kompilacji. Ta metoda zgłasza PlatformNotSupportedException czas wykonywania na platformie .NET 5 lub nowszym oraz na platformie .NET Core.

Gdy ta metoda jest wywoływana w wątku, system zgłasza ThreadAbortException element w wątku, aby go przerwać. ThreadAbortException jest specjalnym wyjątkiem, który może zostać przechwycony przez kod aplikacji, ale jest zgłaszany ponownie na końcu catch bloku, chyba że ResetAbort jest wywoływany. ResetAbort Anuluje żądanie przerwania i uniemożliwia ThreadAbortException zakończenie wątku. Nieskonseksowane finally bloki są wykonywane przed przerwanie wątku.

Uwaga / Notatka

Gdy wątek wywołuje Abort się samodzielnie, efekt jest podobny do zgłaszania wyjątku; ThreadAbortException występuje 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 ani 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, tym samym przez czas nieokreślony opóźniając przerwanie. Aby poczekać na przerwanie wątku, możesz wywołać Join metodę w wątku po wywołaniu Abort metody, ale nie ma gwarancji, że oczekiwanie zakończy się.

Uwaga / Notatka

Wątek, który wywołuje 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 element 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 A 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 pochodzą Abort w tym samym czasie, możliwe jest, aby jedno wywołanie ustawiło informacje o stanie i drugie wywołanie w celu wykonania Abort. Jednak aplikacja nie może wykryć tej sytuacji.

Po Abort wywołaniu w wątku stan wątku obejmuje .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 celem obiektu Abort docelowego, 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