Udostępnij za pośrednictwem


Element Thread.Abort jest 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.

Opis zmiany

Wcześniej wywołania nie Thread.Abort wygenerowały ostrzeżeń czasu kompilacji, jednak metoda zgłosiła PlatformNotSupportedException błąd w czasie wykonywania.

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

Przyczyna wprowadzenia zmiany

Biorąc pod uwagę, że Thread.Abort zawsze zgłasza PlatformNotSupportedException wszystkie implementacje 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 metody przerwania wątku innego niż bieżący wątek nie wiadomo, jaki kod został wykonany lub nie można wykonać go ThreadAbortException po wyświetleniu. Nie można również mieć pewności co do stanu aplikacji ani jakiejkolwiek aplikacji i stanu użytkownika, który jest odpowiedzialny za zachowanie. 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+.

Wprowadzona wersja

5,0

  • Użyj elementu , CancellationToken aby przerwać przetwarzanie jednostki pracy zamiast wywoływania metody 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 kodu i pomijany nie pomija innych ostrzeżeń dotyczących obsoletionów w 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>
    

Dotyczy interfejsów API