Sdílet prostřednictvím


Thread.Abort Metoda

Definice

ThreadAbortException Vyvolá ve vlákně, na kterém je vyvolána, aby zahájil proces ukončení vlákna. Volání této metody obvykle ukončí vlákno.

Přetížení

Name Description
Abort()
Zastaralé.

ThreadAbortException Vyvolá ve vlákně, na kterém je vyvolána, aby zahájil proces ukončení vlákna. Volání této metody obvykle ukončí vlákno.

Abort(Object)
Zastaralé.

ThreadAbortException Vyvolá ve vlákně, na kterém je vyvolána, aby zahájil proces ukončení vlákna a zároveň poskytuje informace o výjimce o ukončení vlákna. Volání této metody obvykle ukončí vlákno.

Poznámky

Důležité

Používejte metodu Thread.Abort s opatrností. Zvlášť když ho zavoláte k přerušení vlákna jiného než aktuálního vlákna, nevíte, jaký kód se spustil nebo se nepodařilo provést při ThreadAbortException vyvolání. Také nemůžete mít jistotu o stavu své aplikace nebo jakékoli aplikace a uživatelského stavu, které má zachovat. Volání Thread.Abort může například zabránit spuštění statických konstruktorů nebo uvolnění spravovaných nebo nespravovaných prostředků.

Abort()

Zdroj:
Thread.cs
Zdroj:
Thread.cs
Zdroj:
Thread.cs
Zdroj:
Thread.cs
Zdroj:
Thread.cs

Upozornění

Thread.Abort is not supported and throws PlatformNotSupportedException.

ThreadAbortException Vyvolá ve vlákně, na kterém je vyvolána, aby zahájil proces ukončení vlákna. Volání této metody obvykle ukončí vlákno.

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 ()
Atributy

Výjimky

Pouze .NET Core a .NET 5+ : Ve všech případech.

Volající nemá požadované oprávnění.

Vlákno, které se právě přerušuje, je nyní pozastaveno.

Poznámky

Tato metoda je zastaralá. V rozhraní .NET 5 a novějších verzích vyvolá volání této metody upozornění v době kompilace. Tato metoda vyvolá PlatformNotSupportedException za běhu v .NET 5 a novějších a .NET Core.

Pokud je tato metoda vyvolána ve vlákně, systém vyvolá ThreadAbortException ve vlákně přerušení. ThreadAbortException je zvláštní výjimka, kterou lze zachytit kódem aplikace, ale je znovu vyvolána na konci catch bloku, pokud ResetAbort není volána. ResetAbort zruší požadavek na přerušení a zabrání ThreadAbortException ukončení vlákna. Bloky, které nejsou finally provedeny, se spustí před přerušením vlákna.

Poznámka:

Když vlákno volá Abort sám sebe, efekt je podobný vyvolání výjimky; ThreadAbortException k tomu dojde okamžitě a výsledek je předvídatelný. Pokud však jedno vlákno volá Abort v jiném vlákně, přeruší se přerušení jakéhokoli spuštěného kódu. Existuje také šance, že statický konstruktor může být přerušen. Ve výjimečných případech to může bránit vytváření instancí této třídy v této doméně aplikace.

Vlákno není zaručeno okamžité přerušení nebo vůbec. K této situaci může dojít v případě, že vlákno provádí nevázané množství výpočtů v finally blocích, které jsou volána jako součást procedury přerušení, čímž se trvale zpozdí přerušení. Chcete-li počkat na přerušení vlákna, můžete volat Join metodu ve vlákně po volání Abort metody, ale neexistuje žádná záruka, že čekání skončí.

Poznámka:

Vlákno, které volá Abort , může blokovat, pokud je vlákno, které je přerušeno, v chráněné oblasti kódu, jako catch je blok, finally blok nebo omezená oblast provádění. Pokud vlákno, které volá Abort , obsahuje zámek, který přerušované vlákno vyžaduje, může dojít k zablokování.

Pokud Abort je volána ve vlákně, které nebylo spuštěno, vlákno se přeruší při Start zavolání. Pokud Abort je volána na vlákně, které je blokováno nebo je spí, vlákno je přerušeno a poté přerušeno.

Pokud Abort je volána ve vlákně, které bylo pozastaveno, je vyvolána ve vlákně, ThreadStateException které volané Abort, a AbortRequested je přidána do ThreadState vlastnosti vlákna je přerušena. V pozastavené vlákně není vyvolána hodnota A ThreadAbortException , dokud Resume se nevolá.

Pokud Abort je volána ve spravovaném vlákně, když spouští nespravovaný kód, nevyvolá se, ThreadAbortException dokud se vlákno nevrátí do spravovaného kódu.

Pokud dva volání Abort přicházejí současně, je možné, aby jedno volání nastavil informace o stavu a druhé volání ke spuštění Abort. Aplikace však nemůže tuto situaci rozpoznat.

Po Abort vyvolání ve vlákně obsahuje stav vlákna AbortRequested. Po ukončení vlákna v důsledku úspěšného volání Abort, stav vlákna se změní na Stopped. S dostatečnými oprávněními může vlákno, které je cílem objektu, Abort zrušit přerušení pomocí ResetAbort metody. Příklad, který ukazuje volání ResetAbort metody, viz ThreadAbortException třída.

Viz také

Platí pro

Abort(Object)

Zdroj:
Thread.cs
Zdroj:
Thread.cs
Zdroj:
Thread.cs
Zdroj:
Thread.cs
Zdroj:
Thread.cs

Upozornění

Thread.Abort is not supported and throws PlatformNotSupportedException.

ThreadAbortException Vyvolá ve vlákně, na kterém je vyvolána, aby zahájil proces ukončení vlákna a zároveň poskytuje informace o výjimce o ukončení vlákna. Volání této metody obvykle ukončí vlákno.

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

Objekt, který obsahuje informace specifické pro aplikaci, například stav, které může vlákno přerušit.

Atributy

Výjimky

Pouze .NET Core a .NET 5+ : Ve všech případech.

Volající nemá požadované oprávnění.

Vlákno, které se právě přerušuje, je nyní pozastaveno.

Příklady

Následující příklad kódu ukazuje, jak předat informace do vlákna, které je přerušeno.

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

Poznámky

Tato metoda je zastaralá. V rozhraní .NET 5 a novějších verzích vyvolá volání této metody upozornění v době kompilace. Tato metoda vyvolá PlatformNotSupportedException za běhu v .NET 5 a novějších a .NET Core.

Pokud je tato metoda vyvolána ve vlákně, systém vyvolá ThreadAbortException ve vlákně přerušení. ThreadAbortException je zvláštní výjimka, kterou lze zachytit kódem aplikace, ale je znovu vyvolána na konci catch bloku, pokud ResetAbort není volána. ResetAbort zruší požadavek na přerušení a zabrání ThreadAbortException ukončení vlákna. Bloky, které nejsou finally provedeny, se spustí před přerušením vlákna.

Poznámka:

Když vlákno volá Abort sám sebe, efekt je podobný vyvolání výjimky; ThreadAbortException k tomu dojde okamžitě a výsledek je předvídatelný. Pokud však jedno vlákno volá Abort v jiném vlákně, přeruší se přerušení jakéhokoli spuštěného kódu. Je možné, že statický konstruktor může být přerušen. Ve výjimečných případech to může bránit vytváření instancí této třídy v této doméně aplikace.

Vlákno není zaručeno okamžité přerušení nebo vůbec. K této situaci může dojít v případě, že vlákno provádí nevázané množství výpočtů v finally blocích, které jsou volána jako součást procedury přerušení, čímž se trvale zpozdí přerušení. Chcete-li počkat na přerušení vlákna, můžete volat Join metodu ve vlákně po volání Abort metody, ale neexistuje žádná záruka, že čekání skončí.

Poznámka:

Vlákno, které volá Abort , může blokovat, pokud je vlákno, které je přerušeno, v chráněné oblasti kódu, jako catch je blok, finally blok nebo omezená oblast provádění. Pokud vlákno, které volá Abort , obsahuje zámek, který přerušované vlákno vyžaduje, může dojít k zablokování.

Pokud Abort je volána ve vlákně, které nebylo spuštěno, vlákno se přeruší při Start zavolání. Pokud Abort je volána na vlákně, které je blokováno nebo je spí, vlákno je přerušeno a poté přerušeno.

Pokud Abort je volána ve vlákně, které bylo pozastaveno, je vyvolána ve vlákně, ThreadStateException které volané Abort, a AbortRequested je přidána do ThreadState vlastnosti vlákna je přerušena. V pozastavené vlákně není vyvolána hodnota A ThreadAbortException , dokud Resume se nevolá.

Pokud Abort je volána ve spravovaném vlákně, když spouští nespravovaný kód, nevyvolá se, ThreadAbortException dokud se vlákno nevrátí do spravovaného kódu.

Pokud dva volání Abort přicházejí současně, je možné, aby jedno volání nastavil informace o stavu a druhé volání ke spuštění Abort. Aplikace však nemůže tuto situaci rozpoznat.

Po Abort vyvolání ve vlákně obsahuje stav vlákna AbortRequested. Po ukončení vlákna v důsledku úspěšného volání Abort, stav vlákna se změní na Stopped. S dostatečnými oprávněními může vlákno, které je cílem objektu, Abort zrušit přerušení pomocí ResetAbort metody. Příklad, který ukazuje volání ResetAbort metody, viz ThreadAbortException třída.

Viz také

Platí pro