首页 > 后端开发 > C++ > 如何在不使用 Thread.Abort() 的情况下安全地中断 .NET 中长时间运行的任务?

如何在不使用 Thread.Abort() 的情况下安全地中断 .NET 中长时间运行的任务?

Patricia Arquette
发布: 2025-01-20 01:07:09
原创
954 人浏览过

How to Safely Interrupt Long-Running Tasks in .NET Without Using Thread.Abort()?

安全停止 .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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板