Dela via


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 kompilatorvarningar, 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 ändring

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 lanserad

5,0

  • 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 att undertrycka den påverkar inte andra obsoletionsvarningar i din kod. Vi rekommenderar dock att du tar bort anrop till Thread.Abort i stället för att 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>
    

Berörda API:er