Compartir por


Thread.Abort Método

Definición

Genera un ThreadAbortException elemento en el subproceso en el que se invoca para comenzar el proceso de finalización del subproceso. Llamar a este método normalmente finaliza el subproceso.

Sobrecargas

Nombre Description
Abort()
Obsoletos.

Genera un ThreadAbortException elemento en el subproceso en el que se invoca para comenzar el proceso de terminación del subproceso. Llamar a este método normalmente finaliza el subproceso.

Abort(Object)
Obsoletos.

Genera un ThreadAbortException elemento en el subproceso en el que se invoca, para comenzar el proceso de terminación del subproceso, al tiempo que proporciona información de excepción sobre la terminación del subproceso. Llamar a este método normalmente finaliza el subproceso.

Comentarios

Importante

Use el Thread.Abort método con precaución. Especialmente cuando se llama para anular un subproceso distinto del subproceso actual, no se sabe qué código se ha ejecutado o no se pudo ejecutar cuando se produce .ThreadAbortException Tampoco puede estar seguro del estado de su aplicación, ni de cualquier estado de aplicación o usuario que deba preservar. Por ejemplo, llamar Thread.Abort puede impedir la ejecución de constructores estáticos o la liberación de recursos administrados o no administrados.

Abort()

Source:
Thread.cs
Source:
Thread.cs
Source:
Thread.cs
Source:
Thread.cs
Source:
Thread.cs

Precaución

Thread.Abort is not supported and throws PlatformNotSupportedException.

Genera un ThreadAbortException elemento en el subproceso en el que se invoca para comenzar el proceso de terminación del subproceso. Llamar a este método normalmente finaliza el subproceso.

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 ()
Atributos

Excepciones

Solo .NET Core y .NET 5+: en todos los casos.

El autor de la llamada no tiene el permiso necesario.

El subproceso que se está anulando está suspendido actualmente.

Comentarios

Este método está obsoleto. En .NET 5 y versiones posteriores, al llamar a este método se genera una advertencia en tiempo de compilación. Este método produce una PlatformNotSupportedException excepción en tiempo de ejecución en .NET 5 y versiones posteriores y .NET Core.

Cuando se invoca este método en un subproceso, el sistema inicia un ThreadAbortException elemento en el subproceso para anularlo. ThreadAbortException es una excepción especial que el código de aplicación puede detectar, pero se vuelve a iniciar al final del catch bloque a menos ResetAbort que se llame a . ResetAbort cancela la solicitud para anular y evita que ThreadAbortException termine el subproceso. Los bloques sin ejecutar finally se ejecutan antes de que se anule el subproceso.

Nota:

Cuando un subproceso llama Abort a sí mismo, el efecto es similar a iniciar una excepción; ThreadAbortException sucede inmediatamente y el resultado es predecible. Sin embargo, si un subproceso llama a Abort otro subproceso, la anulación interrumpe el código que se está ejecutando. También existe la posibilidad de que se pueda anular un constructor estático. En raras ocasiones, esto puede impedir que se creen instancias de esa clase en ese dominio de aplicación.

No se garantiza que el subproceso se anule inmediatamente o en absoluto. Esta situación puede producirse si un subproceso realiza una cantidad ilimitada de cálculo en los bloques a los finally que se llama como parte del procedimiento de anulación, lo que retrasa indefinidamente la anulación. Para esperar hasta que se anule un subproceso, puede llamar al Join método en el subproceso después de llamar al Abort método , pero no hay ninguna garantía de que finalice la espera.

Nota:

El subproceso que llama Abort podría bloquearse si el subproceso que se está anulando está en una región protegida de código, como un catch bloque, finally un bloque o una región de ejecución restringida. Si el subproceso que llama Abort a contiene un bloqueo que requiere el subproceso anulado, puede producirse un interbloqueo.

Si Abort se llama a en un subproceso que no se ha iniciado, el subproceso anulará cuando Start se llame a . Si Abort se llama a en un subproceso bloqueado o en suspensión, el subproceso se interrumpe y, a continuación, se anula.

Si Abort se llama a en un subproceso suspendido, se produce una ThreadStateException excepción en el subproceso que llamó Aborta y AbortRequested se agrega a la ThreadState propiedad del subproceso que se anula. No ThreadAbortException se produce una excepción en el subproceso suspendido hasta Resume que se llama a .

Si Abort se llama a en un subproceso administrado mientras se ejecuta código no administrado, ThreadAbortException no se inicia hasta que el subproceso vuelve al código administrado.

Si dos llamadas que se van a Abort llegar al mismo tiempo, es posible que una llamada establezca la información de estado y la otra llamada para ejecutar .Abort Sin embargo, una aplicación no puede detectar esta situación.

Después Abort de invocarse en un subproceso, el estado del subproceso incluye AbortRequested. Una vez finalizado el subproceso como resultado de una llamada correcta a Abort, el estado del subproceso se cambia a Stopped. Con permisos suficientes, un subproceso que es el destino de puede Abort cancelar la anulación mediante el ResetAbort método . Para obtener un ejemplo que muestra cómo llamar al ResetAbort método , vea la ThreadAbortException clase .

Consulte también

Se aplica a

Abort(Object)

Source:
Thread.cs
Source:
Thread.cs
Source:
Thread.cs
Source:
Thread.cs
Source:
Thread.cs

Precaución

Thread.Abort is not supported and throws PlatformNotSupportedException.

Genera un ThreadAbortException elemento en el subproceso en el que se invoca, para comenzar el proceso de terminación del subproceso, al tiempo que proporciona información de excepción sobre la terminación del subproceso. Llamar a este método normalmente finaliza el subproceso.

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)

Parámetros

stateInfo
Object

Objeto que contiene información específica de la aplicación, como el estado, que puede usar el subproceso que se va a anular.

Atributos

Excepciones

Solo .NET Core y .NET 5+: en todos los casos.

El autor de la llamada no tiene el permiso necesario.

El subproceso que se está anulando está suspendido actualmente.

Ejemplos

En el ejemplo de código siguiente se muestra cómo pasar información a un subproceso que se está anulando.

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

Comentarios

Este método está obsoleto. En .NET 5 y versiones posteriores, al llamar a este método se genera una advertencia en tiempo de compilación. Este método produce una PlatformNotSupportedException excepción en tiempo de ejecución en .NET 5 y versiones posteriores y .NET Core.

Cuando se invoca este método en un subproceso, el sistema inicia un ThreadAbortException elemento en el subproceso para anularlo. ThreadAbortException es una excepción especial que el código de aplicación puede detectar, pero se vuelve a iniciar al final del catch bloque a menos ResetAbort que se llame a . ResetAbort cancela la solicitud para anular y evita que ThreadAbortException termine el subproceso. Los bloques sin ejecutar finally se ejecutan antes de que se anule el subproceso.

Nota:

Cuando un subproceso llama Abort a sí mismo, el efecto es similar a iniciar una excepción; ThreadAbortException sucede inmediatamente y el resultado es predecible. Sin embargo, si un subproceso llama a Abort otro subproceso, la anulación interrumpe el código que se está ejecutando. Existe la posibilidad de que se pueda anular un constructor estático. En raras ocasiones, esto puede impedir que se creen instancias de esa clase en ese dominio de aplicación.

No se garantiza que el subproceso se anule inmediatamente o en absoluto. Esta situación puede producirse si un subproceso realiza una cantidad ilimitada de cálculo en los bloques a los finally que se llama como parte del procedimiento de anulación, lo que retrasa indefinidamente la anulación. Para esperar hasta que se anule un subproceso, puede llamar al Join método en el subproceso después de llamar al Abort método , pero no hay ninguna garantía de que finalice la espera.

Nota:

El subproceso que llama Abort podría bloquearse si el subproceso que se está anulando está en una región protegida de código, como un catch bloque, finally un bloque o una región de ejecución restringida. Si el subproceso que llama Abort a contiene un bloqueo que requiere el subproceso anulado, puede producirse un interbloqueo.

Si Abort se llama a en un subproceso que no se ha iniciado, el subproceso anulará cuando Start se llame a . Si Abort se llama a en un subproceso bloqueado o en suspensión, el subproceso se interrumpe y, a continuación, se anula.

Si Abort se llama a en un subproceso suspendido, se produce una ThreadStateException excepción en el subproceso que llamó Aborta y AbortRequested se agrega a la ThreadState propiedad del subproceso que se anula. No ThreadAbortException se produce una excepción en el subproceso suspendido hasta Resume que se llama a .

Si Abort se llama a en un subproceso administrado mientras se ejecuta código no administrado, ThreadAbortException no se inicia hasta que el subproceso vuelve al código administrado.

Si dos llamadas que se van a Abort llegar al mismo tiempo, es posible que una llamada establezca la información de estado y la otra llamada para ejecutar .Abort Sin embargo, una aplicación no puede detectar esta situación.

Después Abort de invocarse en un subproceso, el estado del subproceso incluye AbortRequested. Una vez finalizado el subproceso como resultado de una llamada correcta a Abort, el estado del subproceso se cambia a Stopped. Con permisos suficientes, un subproceso que es el destino de puede Abort cancelar la anulación mediante el ResetAbort método . Para obtener un ejemplo que muestra cómo llamar al ResetAbort método , vea la ThreadAbortException clase .

Consulte también

Se aplica a