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
Ação recomendada
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>