Partilhar via


Thread.Abort está obsoleto

As Thread.Abort APIs estão obsoletas. Projetos destinados ao .NET 5 ou uma versão posterior encontrarão aviso SYSLIB0006 em tempo de compilação se esses métodos forem chamados.

Alterar a descrição

Anteriormente, as chamadas para Thread.Abort não produziam avisos em tempo de compilação, no entanto, o método lançava um PlatformNotSupportedException em tempo de execução.

A partir do .NET 5, Thread.Abort é marcado como obsoleto como aviso. Chamar esse método produz aviso do SYSLIB0006compilador . A implementação do método permanece inalterada e continua a lançar um PlatformNotSupportedException.

Razão para a alteração

Dado que Thread.Abort sempre lança um PlatformNotSupportedException em todas as implementações .NET, exceto .NET Framework, ObsoleteAttribute foi adicionado ao método para chamar a atenção para os locais onde ele é chamado.

Quando você chama Thread.Abort para anular um thread diferente do thread atual, você não sabe qual código foi executado ou falhou em executar quando o ThreadAbortException é lançado. Você também não pode ter certeza do estado do seu aplicativo ou de qualquer aplicativo e estado do usuário que ele é responsável pela preservação. Por exemplo, a chamada 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 lança um PlatformNotSupportedException no .NET Core e .NET 5+.

Versão introduzida

5.0

  • Use a CancellationToken para cancelar 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 obter mais informações, consulte Cancelamento em threads gerenciados.

  • Para suprimir o aviso em tempo de compilação, suprima o código SYSLIB0006de aviso . O código de aviso é específico e Thread.Abort suprimi-lo não suprime outros avisos de obsolescência em seu código. No entanto, recomendamos que você remova as chamadas para Thread.Abort em 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