Compartir a través de


Thread.Abort obsoleto

Las Thread.Abort API están obsoletas. Los proyectos que tienen como destino .NET 5 o una versión posterior encontrarán una advertencia SYSLIB0006 en tiempo de compilación 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 se marca como obsoleto con advertencia. Al llamar a este método, se genera la advertencia SYSLIB0006del compilador . 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 llamas a Thread.Abort para anular un subproceso distinto del subproceso actual, no sabes qué código se ha ejecutado o ha fallado al ejecutarse cuando se lanza 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. Por este motivo, Thread.Abort siempre lanza un PlatformNotSupportedException en .NET Core y .NET 5+.

Versión introducida

5.0

  • Utiliza CancellationToken para abortar el procesamiento de una unidad de trabajo en lugar de llamar a Thread.Abort. En el ejemplo siguiente 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 SYSLIB0006de advertencia . El código de advertencia es específico de Thread.Abort y suprimirlo no suprime otras advertencias de obsolescencia en tu 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>
    

Las APIs afectadas