Поделиться через


Thread.Abort Метод

Определение

ThreadAbortException Вызывает поток, на котором он вызывается, чтобы начать процесс завершения потока. Вызов этого метода обычно завершает поток.

Перегрузки

Имя Описание
Abort()
Устаревшие..

ThreadAbortException Вызывает поток, на котором он вызывается, чтобы начать процесс завершения потока. Вызов этого метода обычно завершает поток.

Abort(Object)
Устаревшие..

ThreadAbortException Вызывает поток, на котором он вызывается, для начала процесса завершения потока, а также предоставления сведений об исключении о завершении потока. Вызов этого метода обычно завершает поток.

Комментарии

Это важно

Thread.Abort Используйте метод с осторожностью. Особенно при вызове потока, отличного от текущего потока, вы не знаете, какой код выполнил или не удалось выполнить при ThreadAbortException возникновении. Вы также не можете быть уверены в состоянии вашего приложения или состоянии любого другого приложения, за сохранение которого оно несет ответственность. Например, вызов Thread.Abort может препятствовать выполнению статических конструкторов или выпуску управляемых или неуправляемых ресурсов.

Abort()

Исходный код:
Thread.cs
Исходный код:
Thread.cs
Исходный код:
Thread.cs
Исходный код:
Thread.cs
Исходный код:
Thread.cs

Внимание

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 в другом потоке, прерывание прерывает выполнение любого кода. Существует также вероятность прерывания статического конструктора. В редких случаях это может препятствовать созданию экземпляров этого класса в этом домене приложения.

Поток не гарантируется немедленно или вообще. Эта ситуация может произойти, если поток выполняет несвязанное количество вычислений в 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.cs
Исходный код:
Thread.cs
Исходный код:
Thread.cs
Исходный код:
Thread.cs
Исходный код:
Thread.cs

Внимание

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 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

Комментарии

Этот метод устарел. При вызове этого метода в .NET 5 и более поздних версиях создается предупреждение во время компиляции. Этот метод создает PlatformNotSupportedException исключение во время выполнения в .NET 5 и более поздних версиях и .NET Core.

При вызове этого метода в потоке система создает ThreadAbortException в потоке исключение. ThreadAbortException — это специальное исключение, которое может быть поймано кодом приложения, но создается повторно в конце catch блока, если ResetAbort не вызывается. ResetAbort отменяет ThreadAbortException запрос на прерывание и предотвращает завершение потока. Неисчерченные finally блоки выполняются до прерывания потока.

Замечание

Когда поток вызывается Abort на себя, эффект аналогичен вызову исключения; ThreadAbortException происходит немедленно, и результат прогнозируется. Однако если один поток вызывается Abort в другом потоке, прерывание прерывает выполнение любого кода. Существует вероятность прерывания статического конструктора. В редких случаях это может препятствовать созданию экземпляров этого класса в этом домене приложения.

Поток не гарантируется немедленно или вообще. Эта ситуация может произойти, если поток выполняет несвязанное количество вычислений в 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 классе.

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

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