SYSLIB0006:不支持 Thread.Abort

从 .NET 5 开始,以下 API 标记为已过时。 使用这些 API 会在编译时生成警告 SYSLIB0006,并在运行时生成 PlatformNotSupportedException

当调用 Thread.Abort 以中止当前线程以外的线程时,不知道引发 ThreadAbortException 异常时哪些代码已经执行,哪些代码未能执行。 你也不能确定应用程序的状态及其负责保留的任何应用程序和用户状态。 例如,调用 Thread.Abort 可能会阻止执行静态构造函数或释放托管或非托管资源。 因此,Thread.Abort 始终在 .NET Core 和 .NET 5+ 上引发 PlatformNotSupportedException

解决方法

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

抑制警告

如果必须使用已过时的 API,可在代码或项目文件中禁止显示警告。

若只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用警告。

// Disable the warning.
#pragma warning disable SYSLIB0006

// Code that uses obsolete API.
// ...

// Re-enable the warning.
#pragma warning restore SYSLIB0006

若要禁止显示项目中的所有 SYSLIB0006 警告,请将属性 <NoWarn> 添加到项目文件。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0006</NoWarn>
  </PropertyGroup>
</Project>

有关详细信息,请参阅取消警告

另请参阅