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 класса.

См. также раздел

Применяется к

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 класса.

См. также раздел

Применяется к