Thread.Abort Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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 Abort
elementu 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ż
- ThreadAbortException
- Aborted
- AbortRequested
- Wątki i wątkowość
- Używanie wątków i wątkowości
- Niszczenie wątków
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 Abort
elementu 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ż
- ThreadAbortException
- Aborted
- AbortRequested
- Wątki i wątkowość
- Używanie wątków i wątkowości
- Niszczenie wątków