Thread.Abort ist veraltet

Die Thread.Abort-APIs sind veraltet. Bei Projekten für .NET 5 und höher wird bei Aufruf dieser Methoden zur Kompilierzeit die Warnung SYSLIB0006 angezeigt.

Änderungsbeschreibung

Zuvor wurden bei Aufrufen von Thread.Abort keine Warnungen zur Kompilierzeit erzeugt. Die Methode löste jedoch zur Laufzeit die Ausnahme PlatformNotSupportedException aus.

Ab .NET 5 ist Thread.Abort mit einer Warnung als veraltet gekennzeichnet. Beim Aufrufen dieser Methode wird die Compilerwarnung SYSLIB0006 erzeugt. Die Implementierung der Methode bleibt unverändert, und die Ausnahme PlatformNotSupportedException wird weiterhin ausgelöst.

Grund für die Änderung

Da Thread.Abort immer für alle .NET-Implementierungen außer das .NET Framework die Ausnahme PlatformNotSupportedException auslöst, wurde der Methode ObsoleteAttribute hinzugefügt, um die Aufmerksamkeit auf die Stellen zu lenken, an denen diese Methode aufgerufen wird.

Wenn Sie Thread.Abort aufrufen, um einen anderen Thread als den aktuellen Thread zu beenden, wissen Sie nicht, welcher Code ausgeführt wurde oder nicht ausgeführt werden konnte, wenn die ThreadAbortException ausgelöst wird. Sie können sich auch nicht sicher sein, welchen Zustand Ihre Anwendung oder ein Anwendungs- und Benutzerstatus hat, für den sie verantwortlich ist. Beispielsweise kann der Aufruf von Thread.Abort die Ausführung statischer Konstruktoren oder die Freigabe verwalteter oder nicht verwalteter Ressourcen verhindern. Aus diesem Grund löst Thread.Abort in .NET Core und .NET 5 und höher immer eine PlatformNotSupportedException aus.

Eingeführt in Version

5.0

  • Verwenden Sie CancellationToken, um die Verarbeitung einer Arbeitseinheit abzubrechen, statt Thread.Abort aufzurufen. Im folgenden Beispiel wird die Verwendung von CancellationToken veranschaulicht.

    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);
        }
    }
    

    Weitere Informationen finden Sie unter Abbruch in verwalteten Threads.

  • Unterdrücken Sie den Warnungscode SYSLIB0006, um die Warnung zur Kompilierzeit zu unterdrücken. Dieser Warnungscode ist spezifisch für Thread.Abort. Bei seiner Unterdrückung werden folglich in Ihrem Code keine anderen Warnungen aufgrund von veralteten Elementen unterdrückt. Es wird jedoch empfohlen, die Aufrufe von Thread.Abort zu entfernen statt die Warnung zu unterdrücken.

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

    Sie können die Warnung auch in der Projektdatei unterdrücken.

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

Betroffene APIs