Compartilhar via


Thread.Abort está obsoleto

As APIs Thread.Abort estão obsoletas. Os projetos direcionados ao .NET 5 ou a uma versão posterior encontrarão um aviso SYSLIB0006 de tempo de compilação se esses métodos forem chamados.

Descrição das alterações

Antes, as chamadas a Thread.Abort não geravam avisos de tempo de compilação, no entanto, o método gerava uma PlatformNotSupportedException em tempo de execução.

Do .NET 5 em diante, Thread.Abort está marcado como obsoleto como aviso. A chamada a esse método produz o aviso do compilador SYSLIB0006. A implementação do método não foi alterada e ele continua a gerar uma PlatformNotSupportedException.

Motivo da alteração

Considerando que Thread.Abort sempre gera uma PlatformNotSupportedException em todas as implementações do .NET, exceto no .NET Framework, ObsoleteAttribute foi adicionado ao método para chamar a atenção onde ele é chamado.

Ao chamar Thread.Abort para anular um thread diferente do atual, você não sabe qual código foi executado ou não foi quando o erro ThreadAbortException é gerado. Você também não tem certeza sobre o estado do seu aplicativo ou de qualquer outro, e estado do usuário que ele é responsável por preservar. Por exemplo, a chamada de Thread.Abort pode impedir a execução de construtores estáticos ou a liberação de recursos gerenciados ou não gerenciados. Por esse motivo, Thread.Abort sempre gera um erro PlatformNotSupportedException .NET Core e no .NET 5 e posteriores.

Versão introduzida

5,0

  • Use um CancellationToken para anular o processamento de uma unidade de trabalho, em vez de chamar Thread.Abort. O exemplo a seguir ilustra o 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 saber mais, confira Cancelamento em threads gerenciados.

  • Para suprimir o aviso em tempo de compilação, suprima o código de aviso SYSLIB0006. O código de aviso é específico do Thread.Abort e a supressão não suprime outros avisos de obsolescência no código. No entanto, recomendamos que você remova a chamadas a Thread.Abort vez de suprimir o aviso.

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

    Você também pode suprimir o aviso no arquivo de projeto.

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

APIs afetadas