Delen via


De functie Thread.Abort is verouderd

De Thread.Abort API's zijn verouderd. Projecten die gericht zijn op .NET 5 of een latere versie, krijgen een waarschuwing over compileertijd SYSLIB0006 als deze methoden worden aangeroepen.

Beschrijving wijzigen

Voorheen leverden aanroepen naar Thread.Abort geen compilatietijdwaarschuwingen op, maar de methode gooide tijdens runtime een PlatformNotSupportedException fout.

Vanaf .NET 5 wordt Thread.Abort gemarkeerd als verouderd met een waarschuwing. Als u deze methode aanroept, wordt er een compilerwaarschuwing gegenereerd SYSLIB0006. De implementatie van de methode is ongewijzigd en blijft zorgen voor een PlatformNotSupportedException.

Reden voor wijziging

Gezien dat Thread.Abort altijd een PlatformNotSupportedException gooit bij alle .NET-implementaties, met uitzondering van .NET Framework, wordt ObsoleteAttribute aan de methode toegevoegd om de aandacht te vestigen op plaatsen waar deze wordt aangeroepen.

Wanneer u Thread.Abort aanroept om een andere thread dan de huidige thread te stoppen, weet u niet welke code is uitgevoerd of mislukt om uit te voeren wanneer de ThreadAbortException wordt gegooid. U kunt ook niet zeker zijn van de status van uw toepassing, noch van enige toepassings- en gebruikersstatus waarvoor deze verantwoordelijk is om te behouden. Het aanroepen van Thread.Abort kan bijvoorbeeld voorkomen dat statische constructors worden uitgevoerd of de vrijgave van beheerde of onbeheerde resources plaatsvindt. Thread.Abort gooit om deze reden altijd een PlatformNotSupportedException op .NET Core en .NET 5+.

Geïntroduceerde versie

5,0

  • Gebruik een CancellationToken om de verwerking van een werkeenheid af te breken in plaats van aan te roepen Thread.Abort. In het volgende voorbeeld ziet u het gebruik van 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);
        }
    }
    

    Zie Annulering in beheerde threads voor meer informatie.

  • Als u de waarschuwing voor de compilatietijd wilt onderdrukken, onderdrukt u de waarschuwingscode SYSLIB0006. De waarschuwingscode is specifiek voor Thread.Abort en het onderdrukken ervan voorkomt geen andere verouderingswaarschuwingen in uw code. Het wordt echter aanbevolen om Thread.Abort aanroepen te verwijderen in plaats van de waarschuwing te onderdrukken.

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

    U kunt de waarschuwing ook onderdrukken in het projectbestand.

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

Betreffende API's