Thread.Abort Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
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é
- ThreadAbortException
- Aborted
- AbortRequested
- Vlákna a dělení na vlákna
- Použití vláken a dělení na vlákna
- Zničení vláken
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é
- ThreadAbortException
- Aborted
- AbortRequested
- Vlákna a dělení na vlákna
- Použití vláken a dělení na vlákna
- Zničení vláken