Share via


Thread.Abort obsoleto

Las API de Thread.Abort están obsoletas. Los proyectos que tienen como destino .NET 5 o una versión posterior detectan advertencias en tiempo de compilación SYSLIB0006 si se llama a estos métodos.

Descripción del cambio

Anteriormente, las llamadas a Thread.Abort no producían advertencias en tiempo de compilación, pero el método sí producía una excepción PlatformNotSupportedException en tiempo de ejecución.

A partir de .NET 5, Thread.Abort está marcado como obsoleto como advertencia. La llamada a este método produce la advertencia del compilador SYSLIB0006. La implementación del método no cambia y continúa generando una excepción PlatformNotSupportedException.

Motivo del cambio

Dado que Thread.Abort siempre produce una excepción PlatformNotSupportedException en todas las implementaciones de .NET, excepto en .NET Framework, se ha agregado ObsoleteAttribute al método para avisar en los lugares donde se llama a este.

Cuando se llama a Thread.Abort para anular un subproceso distinto del actual, no se sabe qué código se ha ejecutado o no se pudo ejecutar al producirse la excepción 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. Por este motivo, Thread.Abort siempre genera una excepción PlatformNotSupportedException en .NET Core y .NET 5 o versiones posteriores.

Versión introducida

5.0

  • Use un token ce cancelación (CancellationToken) para anular el procesamiento de una unidad de trabajo en lugar de llamar a Thread.Abort. En el siguiente ejemplo se muestra el uso de CancellationToken.

    void ProcessPendingWorkItemsNew(CancellationToken cancellationToken)
    {
        if (QueryIsMoreWorkPending())
        {
            // If the CancellationToken is marked as "needs to cancel",
            // this will throw the appropriate exception.
            cancellationToken.ThrowIfCancellationRequested();
    
            WorkItem work = DequeueWorkItem();
            ProcessWorkItem(work);
        }
    }
    

    Para más información, consulte Cancelación de subprocesos administrados.

  • Para suprimir la advertencia en tiempo de compilación, suprima el código de advertencia SYSLIB0006. El código de advertencia es específico de Thread.Abort y, al suprimirlo, no se suprimen otras advertencias de obsolescencia en el código. Pero se recomienda que elimine las llamadas a Thread.Abort en lugar de suprimir la advertencia.

    void MyMethod()
    {
    #pragma warning disable SYSLIB0006
        Thread.CurrentThread.Abort();
    #pragma warning restore SYSLIB0006
    }
    

    También puede suprimir la advertencia en el archivo del proyecto.

    <PropertyGroup>
      <OutputType>Exe</OutputType>
      <TargetFramework>net5.0</TargetFramework>
      <!-- Disable "Thread.Abort is obsolete" warnings for entire project. -->
      <NoWarn>$(NoWarn);SYSLIB0006</NoWarn>
    </PropertyGroup>
    

API afectadas