Thread.Abort Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока. Вызов данного метода обычно завершает поток.
Перегрузки
Abort() |
Является устаревшей.
Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока. Вызов данного метода обычно завершает поток. |
Abort(Object) |
Является устаревшей.
Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока, в то же время предоставляя сведения об исключении касательно исключения завершения потока. Вызов данного метода обычно завершает поток. |
Комментарии
Важно!
Thread.Abort
Метод следует использовать с осторожностью. Особенно при вызове метода для прерывания работы потока, отличного от текущего потока, неизвестно, какой код выполнялся или не удалось выполнить при ThreadAbortException возникновении исключения. Кроме того, не может быть определено состояние приложения или любое приложение и пользовательское состояние, которое отвечает за сохранение. Например, вызов Thread.Abort
может препятствовать выполнению статических конструкторов или выпусков неуправляемых ресурсов.
Abort()
Внимание!
Thread.Abort is not supported and throws PlatformNotSupportedException.
Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока. Вызов данного метода обычно завершает поток.
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 ()
- Атрибуты
Исключения
Только .NET Core и .NET 5+: Во всех случаях.
У вызывающего объекта отсутствует необходимое разрешение.
Поток, который прерывается, в настоящий момент приостановлен.
Комментарии
Этот метод устарел. В .NET 5 и более поздних версиях вызов этого метода приводит к выдаче предупреждения во время компиляции. Этот метод создает исключение PlatformNotSupportedException во время выполнения в .NET 5 и более поздних версиях и .NET Core.
При вызове этого метода в потоке система создает исключение ThreadAbortException в потоке, чтобы его прервать. ThreadAbortException
— специальное исключение, которое может быть перехвачено кодом приложения, но повторно создается в конце catch
блока, если ResetAbort не вызывается метод. ResetAbort
отменяет запрос для прерывания и предотвращает ThreadAbortException
завершение потока потоком. Невыполненные finally
блоки выполняются до отмены потока.
Примечание
Когда поток вызывает Abort
сам себя, этот результат аналогичен созданию исключения; ThreadAbortException происходит немедленно, и результат является прогнозируемым. Однако если один поток вызывает Abort
другой поток, прерывание прерывает выполнение любого кода. Существует также вероятность прерывания статического конструктора. В редких случаях это может препятствовать созданию экземпляров этого класса в этом домене приложения. в платформа .NET Framework версиях 1,0 и 1,1 существует шанс, что поток может прерваться во время finally
выполнения блока, в этом случае finally
блок будет прерван.
Поток не гарантирует немедленное прерывание или вообще. Такая ситуация может возникнуть, если поток выполняет неограниченное количество вычислений в finally
блоках, которые вызываются как часть процедуры прерывания, тем самым откладывая прерывание. Чтобы подождать, пока поток не будет прерван, можно вызвать Join метод в потоке после вызова Abort метода, но нет гарантии, что ожидание завершится.
Примечание
Поток, вызывающий, Abort может блокироваться, если поток, который выполняется, находится в защищенной области кода, например блок, catch
finally
блок или область ограниченного выполнения. Если поток, вызывающий, Abort удерживает блокировку, требуемую для прерванного потока, может возникнуть взаимоблокировка.
Если Abort
вызывается для потока, который не был запущен, поток будет прерван при Start вызове метода. Если Abort
вызывается для потока, который заблокирован или находится в режиме ожидания, то поток прерывается, а затем прерывается.
Если Abort
вызывается для потока, который был приостановлен, в ThreadStateException потоке, вызвавшем метод, создается исключение, которое Abort AbortRequested добавляется к ThreadState свойству потока, для которого выполняется прерывание. ThreadAbortExceptionИсключение не создается в приостановленном потоке до Resume вызова метода.
Если Abort
вызывается в управляемом потоке во время выполнения неуправляемого кода, ThreadAbortException
исключение не создается, пока поток не вернется в управляемый код.
Если два вызова Abort
поступают в одно и то же время, один вызов может установить сведения о состоянии и другой вызов для выполнения Abort
. Однако приложение не может обнаружить такую ситуацию.
После Abort
вызова в потоке состояние потока включает AbortRequested . После того как поток завершился в результате успешного вызова метода Abort
, состояние потока изменяется на Stopped . С достаточными разрешениями поток, являющийся целью, Abort
может отменить прерывание с помощью ResetAbort
метода. Пример, демонстрирующий вызов ResetAbort
метода, см. в описании ThreadAbortException
класса.
См. также раздел
- ThreadAbortException
- Aborted
- AbortRequested
- Потоки и работа с потоками
- Использование потоков и работа с потоками
- Удаление потоков
Применяется к
Abort(Object)
Внимание!
Thread.Abort is not supported and throws PlatformNotSupportedException.
Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока, в то же время предоставляя сведения об исключении касательно исключения завершения потока. Вызов данного метода обычно завершает поток.
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)
Параметры
- stateInfo
- Object
Объект, который содержит информацию об определенном приложении, например состояние, которое может использоваться аварийно завершающимся потоком.
- Атрибуты
Исключения
Только .NET Core и .NET 5+: Во всех случаях.
У вызывающего объекта отсутствует необходимое разрешение.
Поток, который прерывается, в настоящий момент приостановлен.
Примеры
В следующем примере кода показано, как передать сведения в поток, который будет прерван.
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
Комментарии
Этот метод устарел. В .NET 5 и более поздних версиях вызов этого метода приводит к выдаче предупреждения во время компиляции. Этот метод создает исключение PlatformNotSupportedException во время выполнения в .NET 5 и более поздних версиях и .NET Core.
При вызове этого метода в потоке система создает исключение ThreadAbortException в потоке, чтобы его прервать. ThreadAbortException
— специальное исключение, которое может быть перехвачено кодом приложения, но повторно создается в конце catch
блока, если ResetAbort не вызывается метод. ResetAbort
отменяет запрос для прерывания и предотвращает ThreadAbortException
завершение потока потоком. Невыполненные finally
блоки выполняются до отмены потока.
Примечание
Когда поток вызывает Abort
сам себя, этот результат аналогичен созданию исключения; ThreadAbortException происходит немедленно, и результат является прогнозируемым. Однако если один поток вызывает Abort
другой поток, прерывание прерывает выполнение любого кода. Существует вероятность прерывания статического конструктора. В редких случаях это может препятствовать созданию экземпляров этого класса в этом домене приложения. в платформа .NET Framework версиях 1,0 и 1,1 существует шанс, что поток может прерваться во время finally
выполнения блока, в этом случае finally
блок будет прерван.
Поток не гарантирует немедленное прерывание или вообще. Такая ситуация может возникнуть, если поток выполняет неограниченное количество вычислений в finally
блоках, которые вызываются как часть процедуры прерывания, тем самым откладывая прерывание. Чтобы подождать, пока поток не будет прерван, можно вызвать Join метод в потоке после вызова Abort метода, но нет никакой гарантии, что ожидание завершится.
Примечание
Поток, вызывающий, Abort может блокироваться, если поток, который выполняется, находится в защищенной области кода, например блок, catch
finally
блок или область ограниченного выполнения. Если поток, вызывающий, Abort удерживает блокировку, требуемую для прерванного потока, может возникнуть взаимоблокировка.
Если Abort
вызывается для потока, который не был запущен, поток будет прерван при Start вызове метода. Если Abort
вызывается для потока, который заблокирован или находится в режиме ожидания, то поток прерывается, а затем прерывается.
Если Abort
вызывается для потока, который был приостановлен, в ThreadStateException потоке, вызвавшем метод, создается исключение, которое Abort AbortRequested добавляется к ThreadState свойству потока, для которого выполняется прерывание. ThreadAbortExceptionИсключение не создается в приостановленном потоке до Resume вызова метода.
Если Abort
вызывается в управляемом потоке во время выполнения неуправляемого кода, ThreadAbortException
исключение не создается, пока поток не вернется в управляемый код.
Если два вызова Abort
поступают в одно и то же время, один вызов может установить сведения о состоянии и другой вызов для выполнения Abort
. Однако приложение не может обнаружить такую ситуацию.
После Abort
вызова в потоке состояние потока включает AbortRequested . После того как поток завершился в результате успешного вызова метода Abort
, состояние потока изменяется на Stopped . С достаточными разрешениями поток, являющийся целью, Abort
может отменить прерывание с помощью ResetAbort
метода. Пример, демонстрирующий вызов ResetAbort
метода, см. в описании ThreadAbortException
класса.
См. также раздел
- ThreadAbortException
- Aborted
- AbortRequested
- Потоки и работа с потоками
- Использование потоков и работа с потоками
- Удаление потоков