Поделиться через


"Thread.Abort" устарел

Thread.Abort API устарели. При вызове этих методов проекты, предназначенные для .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