Thread.Abort är föråldrat
Thread.Abort API:erna är föråldrade. Projekt som riktar in sig på .NET 5 eller en senare version får kompileringstidsvarning SYSLIB0006
om dessa metoder anropas.
Ändra beskrivning
Tidigare gav anrop till Thread.Abort inte kompileringstidsvarningar, men metoden utlöste en PlatformNotSupportedException vid körning.
Från och med .NET 5 Thread.Abort markeras som föråldrad som varning. Om du anropar den här metoden genereras en kompilatorvarning SYSLIB0006
. Implementeringen av metoden är oförändrad och den fortsätter att utlösa en PlatformNotSupportedException.
Orsak till ändringen
Med tanke på att Thread.Abort alltid genererar en PlatformNotSupportedException på alla .NET-implementeringar utom .NET Framework, ObsoleteAttribute lades den till i metoden för att uppmärksamma platser där den anropas.
När du anropar Thread.Abort för att avbryta en annan tråd än den aktuella tråden vet du inte vilken kod som har körts eller inte kunde köras när den ThreadAbortException genereras. Du kan inte heller vara säker på tillståndet för ditt program eller något program och användartillstånd som det är ansvarigt för att bevara. Anrop Thread.Abort kan till exempel förhindra körning av statiska konstruktorer eller frisläppning av hanterade eller ohanterade resurser. Därför Thread.Abort genererar alltid en PlatformNotSupportedException på .NET Core och .NET 5+.
Version introducerad
5,0
Rekommenderad åtgärd
Använd a CancellationToken för att avbryta bearbetningen av en arbetsenhet i stället för att anropa Thread.Abort. I följande exempel visas användningen av 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); } }
Mer information finns i Annullering i hanterade trådar.
Om du vill förhindra kompileringstidsvarningen undertrycker du varningskoden
SYSLIB0006
. Varningskoden är specifik för Thread.Abort och undertrycker den inte andra obsoletionsvarningar i koden. Vi rekommenderar dock att du tar bort anrop till i stället för att Thread.Abort ignorera varningen.void MyMethod() { #pragma warning disable SYSLIB0006 Thread.CurrentThread.Abort(); #pragma warning restore SYSLIB0006 }
Du kan också ignorera varningen i projektfilen.
<PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net5.0</TargetFramework> <!-- Disable "Thread.Abort is obsolete" warnings for entire project. --> <NoWarn>$(NoWarn);SYSLIB0006</NoWarn> </PropertyGroup>