Sdílet prostřednictvím


Thread.Abort Metoda

Definice

Vyvolá ve vlákně, ve kterém je vyvoláno, zahajuje proces ThreadAbortException ukončování vlákna. Volání této metody obvykle ukončí vlákno.

Přetížení

Abort()
Zastaralé.

Vyvolá ve vlákně, ve kterém je vyvoláno, zahajuje proces ThreadAbortException ukončování vlákna. Volání této metody obvykle ukončí vlákno.

Abort(Object)
Zastaralé.

Vyvolá ThreadAbortException ve vlákně, ve kterém je vyvoláno, k zahájení procesu ukončení vlákna a zároveň poskytuje informace o výjimce týkající se ukončení vlákna. Volání této metody obvykle ukončí vlákno.

Poznámky

Důležité

Metoda Thread.Abort by se měla používat s opatrností. Zejména při volání pro přerušení jiného vlákna, než je aktuální vlákno, nevíte, který kód se provedl nebo se nepodařilo spustit, když ThreadAbortException je vyvolána. Také si nemůžete být jistí stavem aplikace nebo aplikace a uživatele, že je zodpovědný za zachování. Volání může například Thread.Abort zabránit spuštění statických konstruktorů nebo uvolnění nespravovaných prostředků.

Abort()

Upozornění

Thread.Abort is not supported and throws PlatformNotSupportedException.

Vyvolá ve vlákně, ve kterém je vyvoláno, zahajuje proces ThreadAbortException ukončování 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

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

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

Vlákno, které se přerušuje, je aktuálně pozastaveno.

Poznámky

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

Při vyvolání této metody ve vlákně systém vyvolá ve vlákně výjimku , která ThreadAbortException ji přeruší. ThreadAbortException je speciální výjimka, která může být zachycena kódem aplikace, ale je znovu vyvolána na konci bloku, pokud catch ResetAbort není volána. ResetAbort zruší požadavek na přerušení a zabrání ukončení ThreadAbortException vlákna. Nespouštěné finally bloky jsou spuštěny před přerušením vlákna.

Poznámka

Když vlákno volá sám sebe, je účinek podobný jako vyvolání výjimky. K tomu dojde okamžitě a Abort ThreadAbortException výsledek je předvídatelný. Pokud však jedno vlákno volá Abort na jiném vlákně, přerušení přeruší spuštění jakéhokoli kódu. Existuje také možnost přerušení statického konstruktoru. Ve výjimečných případech to může bránit vytvoření instancí této třídy v této doméně aplikace. V .NET Framework verze 1.0 a 1.1 existuje možnost, že vlákno může přerušit během běhu bloku, v takovém případě je blok finally finally přerušen.

Vlákno není zaručeno, že se přeruší okamžitě 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 blocích, které jsou volány jako součást procedury přerušení, a tím na neomezenou dobu zpoždí finally přerušení. Chcete-li počkat na přerušení vlákna, můžete volat metodu ve vlákně po volání metody, ale není Join Abort zaručeno, že čekání skončí.

Poznámka

Vlákno, které volá, může blokovat, pokud je vlákno, které se přeruší, v chráněné oblasti kódu, jako je například blok, blok nebo Abort catch finally constrained execution region. Pokud vlákno, které volá Abort , obsahuje zámek, který přerušené vlákno vyžaduje, může dojít k vzájemnému zablokování.

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

Je-li volána ve vlákně, které bylo pozastaveno, je vyvolána ve vlákně, které volalo , a je přidán do vlastnosti přerušení Abort ThreadStateException Abort AbortRequested ThreadState vlákna. Není ThreadAbortException vyvolána v pozastaveném vlákně, dokud Resume není volána.

Pokud je volána ve spravovaném vlákně při provádění nespravovaného kódu, není vyvolána, dokud se Abort ThreadAbortException vlákno nevrátí do spravovaného kódu.

Pokud dvě volání přicházejí ve stejnou dobu, je možné, že jedno volání nastaví informace o stavu a druhé Abort volání pro spuštění Abort . Aplikace ale tuto situaci nedokáže rozpoznat.

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

Viz také

Platí pro

Abort(Object)

Upozornění

Thread.Abort is not supported and throws PlatformNotSupportedException.

Vyvolá ThreadAbortException ve vlákně, ve kterém je vyvoláno, k zahájení procesu ukončení vlákna a zároveň poskytuje informace o výjimce týkající se 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, jako je například stav, který může být použit pro přerušené vlákno.

Atributy

Výjimky

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

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

Přerušené vlákno je aktuálně pozastavené.

Příklady

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

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);
        }
    }
}
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 volání této metody vytvoří upozornění v době kompilace. Tato metoda vyvolá PlatformNotSupportedException v době běhu v rozhraní .NET 5 a novějších a .NET Core.

Pokud je tato metoda vyvolána pro vlákno, systém vyvolá ThreadAbortException ve vlákně, aby ji přerušil. ThreadAbortException je speciální výjimka, která může být zachycena 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 brání v ThreadAbortException ukončení vlákna. Nespuštěné finally bloky se spustí před přerušením vlákna.

Poznámka

Při volání Abort samotného vlákna je efekt podobný vyvolání výjimky. ThreadAbortException dojde k okamžitému a výsledek je předvídatelný. Nicméně pokud jedno vlákno volá Abort jiné vlákno, přerušení přerušení bez ohledu na to, jestli je kód spuštěný. Existuje možnost, že statický konstruktor může být přerušen. Ve výjimečných případech to může zabránit v vytváření instancí této třídy v doméně aplikace. v .NET Framework verzích 1,0 a 1,1 existuje možnost, že vlákno může být přerušeno během finally běhu bloku, v takovém případě finally je blok přerušen.

U vlákna není zaručeno přerušení okamžitě nebo vůbec. K této situaci může dojít, pokud vlákno provádí neohraničené množství výpočtu v finally blocích, které jsou volány jako součást postupu přerušení, a tak neomezeně zpozdí přerušení. Chcete-li počkat na přerušení vlákna, můžete zavolat Join metodu ve vlákně po volání Abort metody, ale není nijak zaručeno, že čekání skončí.

Poznámka

Vlákno, které volá, Abort může zablokovat, pokud je vlákno, které je přerušeno, v chráněné oblasti kódu, například catch blok, finally blok nebo omezení oblasti provádění. Pokud vlákno, které volá, Abort drží zámek, že přerušené 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 bude při volání přerušeno Start . Pokud Abort je volána na vlákně, které je blokováno nebo je v režimu spánku, vlákno je přerušeno a poté přerušeno.

Pokud Abort je volána ve vlákně, které je pozastaveno, ThreadStateException je vyvolána ve vlákně, které je voláno, Abort a AbortRequested je přidána do vlastnosti vlákna, které je ThreadState přerušeno. A není ThreadAbortException vyvolána v pozastaveném vlákně, dokud Resume není voláno.

Pokud Abort je volána ve spravovaném vlákně při provádění nespravovaného kódu, ThreadAbortException není vyvolána, dokud se vlákno nevrátí do spravovaného kódu.

Pokud dvě volání Abort ve stejnou dobu jsou k dispozici, je možné, že jedno volání nastaví stavové informace a druhé volání ke spuštění Abort . Aplikace ale tuto situaci nerozpoznala.

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í do se Abort stav vlákna změní na Stopped . S dostatečnými oprávněními může vlákno, které je cílem, Abort Zrušit přerušení pomocí ResetAbort metody. Příklad, který ukazuje volání ResetAbort metody, naleznete v tématu ThreadAbortException Třída.

Viz také

Platí pro