Thread.Abort 已过时

Thread.Abort API 已过时。 如果调用这些方法,则面向 .NET 5 或更高版本的项目将遇到编译时警告 SYSLIB0006

更改说明

以前,对 Thread.Abort 的调用不会生成编译时警告,但该方法确实会在运行时引发 PlatformNotSupportedException

从 .NET 5 开始,Thread.Abort 以警告的形式标记为已过时。 调用此方法将生成编译器警告 SYSLIB0006。 该方法的实现保持不变,并且继续引发 PlatformNotSupportedException

更改原因

假定 Thread.Abort 在除 .NET Framework 以外的所有 .NET 实现中始终引发 PlatformNotSupportedException,则向该方法添加 ObsoleteAttribute,以引起人们对其调用位置的注意。

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

引入的版本

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