Compartir a través de


Thread.Abort Método

Definición

Genera un ThreadAbortException en el subproceso en el que se invoca para comenzar el proceso de terminación del subproceso. Normalmente, una llamada a este método finaliza el subproceso.

Sobrecargas

Abort()
Obsoletos.

Produce una excepción ThreadAbortException en el subproceso en el que se invoca, para iniciar el proceso de finalización del subproceso. Normalmente, una llamada a este método finaliza el subproceso.

Abort(Object)
Obsoletos.

Produce una excepción ThreadAbortException en el subproceso en el que se invoca, para iniciar el proceso de finalización del subproceso, proporcionando al mismo tiempo información sobre excepciones relativa a la terminación del subproceso. Normalmente, una llamada a este método 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 saberse a ciencia cierta el estado de la aplicación o de cualquier aplicación y estado de usuario que sea responsable de su conservación. Por ejemplo, una llamada a Thread.Abort puede evitar 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

Precaución

Thread.Abort is not supported and throws PlatformNotSupportedException.

Produce una excepción ThreadAbortException en el subproceso en el que se invoca, para iniciar el proceso de finalización del subproceso. Normalmente, una llamada a este método 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

.NET Core y .NET 5+ solo: En todos los casos.

El llamador no dispone del permiso requerido.

Actualmente se suspende el subproceso que se está anulando.

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 anularla e impide 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 producir una excepción; esto ThreadAbortException sucede inmediatamente y el resultado es predecible. Sin embargo, si un subproceso llama Abort a en otro subproceso, la anulación interrumpe cualquier código que se esté ejecutando. También existe la posibilidad de que se pueda anular un constructor estático. En raras ocasiones, esto podría impedir que las instancias de esa clase se creen 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 de cálculo sin enlazar 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 haya anulado 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 a Abort contiene un bloqueo que requiere el subproceso anulado, se puede producir un interbloqueo.

Si Abort se llama a en un subproceso que no se ha iniciado, el subproceso se 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 está anulando. ThreadAbortException No se inicia 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, no se inicia hasta ThreadAbortException que el subproceso vuelve al código administrado.

Si se realizan dos llamadas al Abort 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 un Abort puede cancelar la anulación mediante el ResetAbort método . Para ver 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

Precaución

Thread.Abort is not supported and throws PlatformNotSupportedException.

Produce una excepción ThreadAbortException en el subproceso en el que se invoca, para iniciar el proceso de finalización del subproceso, proporcionando al mismo tiempo información sobre excepciones relativa a la terminación del subproceso. Normalmente, una llamada a este método 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, por ejemplo, su estado, y que el subproceso anulado puede utilizar.

Atributos

Excepciones

.NET Core y .NET 5+ solo: En todos los casos.

El llamador no dispone del permiso requerido.

Actualmente se suspende el subproceso que se está anulando.

Ejemplos

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

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

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 anularla e impide 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 producir una excepción; esto ThreadAbortException sucede inmediatamente y el resultado es predecible. Sin embargo, si un subproceso llama Abort a en otro subproceso, la anulación interrumpe cualquier código que se esté ejecutando. Existe la posibilidad de que se pueda anular un constructor estático. En raras ocasiones, esto podría impedir que las instancias de esa clase se creen 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 de cálculo sin enlazar 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 haya anulado 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 a Abort contiene un bloqueo que requiere el subproceso anulado, se puede producir un interbloqueo.

Si Abort se llama a en un subproceso que no se ha iniciado, el subproceso se 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 está anulando. ThreadAbortException No se inicia 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, no se inicia hasta ThreadAbortException que el subproceso vuelve al código administrado.

Si se realizan dos llamadas al Abort 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 un Abort puede cancelar la anulación mediante el ResetAbort método . Para ver un ejemplo que muestra cómo llamar al ResetAbort método , vea la ThreadAbortException clase .

Consulte también

Se aplica a