Udostępnij za pośrednictwem


Element Thread.Abort jest uznawany za przestarzały

Interfejsy Thread.Abort API są przestarzałe. W przypadku wywołania tych metod projekty przeznaczone dla platformy .NET 5 lub nowszej wersji będą napotykać ostrzeżenie SYSLIB0006 dotyczące czasu kompilacji.

Zmień opis

Wcześniej wywołania do Thread.Abort nie generowały ostrzeżeń kompilacji, jednak metoda zgłaszała PlatformNotSupportedException w czasie wykonywania.

Począwszy od platformy .NET 5, Thread.Abort jest oznaczony jako ostrzeżenie o przestarzałości. Wywołanie tej metody powoduje wygenerowanie ostrzeżenia SYSLIB0006kompilatora . Implementacja metody jest niezmieniona i nadal zgłasza błąd PlatformNotSupportedException.

Przyczyna zmiany

Biorąc pod uwagę, że Thread.Abort zawsze zgłasza PlatformNotSupportedException we wszystkich implementacjach platformy .NET z wyjątkiem programu .NET Framework, ObsoleteAttribute dodano do metody aby zwrócić uwagę na miejsca, w których jest wywoływana.

W przypadku wywołania Thread.Abort do przerwania wątku innego niż bieżący wątek, nie wiesz, jaki kod został wykonany lub nie wykonał się, gdy ThreadAbortException zostanie zgłoszony. Nie można również być pewnym stanu swojej aplikacji, ani stanu jakiejkolwiek aplikacji oraz stanu użytkownika aplikacji, za których zachowanie jest odpowiedzialna. Na przykład wywołanie Thread.Abort może uniemożliwić wykonywanie konstruktorów statycznych lub wydanie zarządzanych lub niezarządzanych zasobów. Z tego powodu Thread.Abort zawsze zgłasza wartość w programach PlatformNotSupportedException .NET Core i .NET 5+.

Wersja wprowadzona

5,0

  • Użyj CancellationToken aby zakończyć przetwarzanie zadania zamiast wywoływać metodę Thread.Abort. W poniższym przykładzie pokazano użycie metody 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);
        }
    }
    

    Aby uzyskać więcej informacji, zobacz Anulowanie w zarządzanych wątkach.

  • Aby pominąć ostrzeżenie dotyczące czasu kompilacji, pomiń kod SYSLIB0006ostrzegawczy . Kod ostrzegawczy jest specyficzny dla Thread.Abort i jego pominięcie nie powoduje pominięcia innych ostrzeżeń o przestarzałości w twoim kodzie. Zalecamy jednak usunięcie wywołań do Thread.Abort zamiast pomijania ostrzeżenia.

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

    Możesz również pominąć ostrzeżenie w pliku projektu.

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

Interfejsy API, których dotyczy problem