避免使用Thread.Abort()取消TPL任务
在使用线程执行任务时,如果尝试使用Abort()
方法终止线程,任务将继续不受干扰地执行。这是因为任务使用线程池中的后台线程,而这些线程不受线程终止的影响。
替代方案:取消标记 (Cancellation Tokens)
为了将取消请求传播到任务,应该使用取消标记。这些标记提供了一种协作的线程取消机制,它将取消请求表示为任务可以监视和响应的信号。
使用取消标记的实现
以下代码片段演示了如何使用取消标记实现任务取消:
<code class="language-csharp">// 创建一个取消标记源 var ts = new CancellationTokenSource(); // 从源获取取消标记 CancellationToken ct = ts.Token; // 创建一个新任务 Task.Factory.StartNew(() => { while (true) { // 执行繁重的计算 Thread.Sleep(100); // 检查取消请求 if (ct.IsCancellationRequested) { Console.WriteLine("任务已取消"); break; } } }, ct); // 模拟等待任务完成3秒 Thread.Sleep(3000); // 决定取消任务 ts.Cancel();</code>
关于.Abort()的注意事项
需要注意的是,通常不建议使用Abort()
方法进行线程取消。此方法可能导致不可靠的行为和潜在的应用程序崩溃。取消标记为任务取消提供了一种更结构化和可靠的方法。
以上是如何在不使用Thread.Abort()的情况下有效取消TPL任务?的详细内容。更多信息请关注PHP中文网其他相关文章!