Thread.Abort устарел

API Thread.Abort являются устаревшими. В проектах, предназначенных для .NET 5 или более поздней версии, можно столкнуться с предупреждениями во время компиляции SYSLIB0006 при вызове этих методов.

Описание изменения

Ранее вызовы Thread.Abort не создавали предупреждения во время компиляции, однако метод вызывал PlatformNotSupportedException во время выполнения.

Начиная с .NET 5 Thread.Abort помечен как устаревший с отображением соответствующего предупреждения. При вызове этого метода выдается предупреждение компилятора SYSLIB0006. Реализация метода остается неизменной, и по-прежнему возникнет исключение PlatformNotSupportedException.

Причина изменения

Учитывая, что Thread.Abort всегда создает PlatformNotSupportedException для всех реализаций .NET, кроме .NET Framework, был добавлен в метод ObsoleteAttribute, чтобы привлечь внимание к местам, где он вызывается.

При вызове Thread.Abort прерывания потока, отличного от текущего потока, вы не знаете, какой код выполнил или не удалось выполнить при ThreadAbortException возникновении. Вы также не можете быть уверены в состоянии приложения или любого приложения и пользовательского состояния, которое оно отвечает за сохранение. Например, вызов Thread.Abort может препятствовать выполнению статических конструкторов или выпуску управляемых или неуправляемых ресурсов. По этой причине Thread.Abort всегда создает исключение PlatformNotSupportedException для .NET Core и .NET 5+.

Представленные версии

5,0

  • Используйте CancellationToken, чтобы прервать обработку единицы работы вместо вызова Thread.Abort. В следующем примере демонстрируется применение 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);
        }
    }
    

    Подробные сведения см. в статье Отмена в управляемых потоках.

  • Чтобы отключить предупреждение во время компиляции, отключите код предупреждения SYSLIB0006. Код предупреждения относится только к Thread.Abort, и подавление не влияет на другие предупреждения об устаревании в коде. Однако рекомендуется удалить вызовы Thread.Abort вместо того, чтобы подавлять предупреждение.

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

    Предупреждение можно также отключить в файле проекта.

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

Затронутые API