安全停止 .NET 任务:Thread.Abort()
与可以使用 Thread.Abort()
强制停止的线程不同,.NET 4.0 及更高版本中的任务缺乏立即终止的直接等效方法。虽然取消令牌提供了一种优雅的退出策略,但某些情况需要立即中断任务。
要求立即终止任务的场景
考虑一个 Windows 窗体应用程序在并行循环中执行阻塞同步 Web 服务调用:
<code class="language-csharp">CancellationTokenSource cts = new CancellationTokenSource(); ParallelOptions po = new ParallelOptions(); po.CancellationToken = cts.Token; po.MaxDegreeOfParallelism = System.Environment.ProcessorCount; Parallel.ForEach(iListOfItems, po, (item, loopState) => { Thread.Sleep(120000); // Simulates a web service call });</code>
如果用户在进程中关闭应用程序,并行循环的线程将继续运行,可能会导致延迟和应用程序冻结。
超越取消令牌
取消令牌是优雅终止的理想选择,但它们对于阻止调用的效果较差。 更强大的解决方案涉及布尔标志 stopExecuting
,在任务循环中检查以发出立即停止的信号:
<code class="language-csharp">bool stopExecuting; Parallel.ForEach(iListOfItems, po, (item, loopState) => { if (stopExecuting) { loopState.Stop(); return; } // Task execution code });</code>
将 stopExecuting
设置为 true
当用户关闭表单时会停止所有正在运行的任务。 然而,这并不能消除已经运行的阻塞调用带来的延迟。
Thread.Abort()
– 最后的手段
Thread.Abort()
可以在并行循环生成的线程上使用,作为最后的手段,但由于潜在的系统不稳定,强烈建议不要这样做。
使用线程安全共享标志并避免立即终止取消令牌,为需要快速任务中断的场景提供了更安全、更易于管理的方法。
以上是如何在不使用 Thread.Abort() 的情况下安全地中断 .NET 中长时间运行的任务?的详细内容。更多信息请关注PHP中文网其他相关文章!