Thread.Abort API 已过时。 如果调用了这些方法,面向 .NET 5 或更高版本的项目将遇到编译时警告 SYSLIB0006 。
更改描述
以前,对 Thread.Abort 调用不生成编译时警告,但是该方法确实在运行时引发 PlatformNotSupportedException 。
从 .NET 5 开始, Thread.Abort 标记为已过时警告。 调用此方法将生成编译器警告 SYSLIB0006。 方法的实现保持不变,并且会继续抛出PlatformNotSupportedException。
更改原因
鉴于Thread.Abort总是在所有 .NET 实现(不包括 .NET Framework)中抛出PlatformNotSupportedException,ObsoleteAttribute被添加到该方法中,以引起对调用其位置的注意。
调用 Thread.Abort 中止当前线程外的其他线程时,当 ThreadAbortException 被抛出时,你无法知道哪些代码已经执行或未执行。 你也不能确定应用程序的状态,也不能确定它负责保留的任何应用程序和用户状态。 例如,调用 Thread.Abort 可能会阻止执行静态构造函数或释放托管或非托管资源。 因此,Thread.Abort 在 .NET Core 和 .NET 5+ 上始终抛出 PlatformNotSupportedException。
已引入的版本
5.0
建议的措施
使用 a 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>