【问题标题】:What happens if Windows service doesn't exit a thread when stopping?如果 Windows 服务在停止时不退出线程会怎样?
【发布时间】:2013-01-09 19:39:12
【问题描述】:

我有一个运行多个线程的 .NET Windows 服务。开发人员向其中添加了一些新线程,但忘记添加代码以在服务停止之前退出线程。当我停止服务时,它似乎正常停止,但服务停止后exe进程继续运行几秒钟。在此期间发生了什么以及线程发生了什么?

【问题讨论】:

标签: .net multithreading c#-4.0 windows-services


【解决方案1】:

我认为存在延迟是因为服务往往会做一些被认为“更重要”的事情,而不是简单地为用户的按钮点击和击键提供服务,例如,关闭数据库连接、断开网络连接、停止驱动程序等。这些事情可能需要几秒钟,因此操作系统会授予一些时间来彻底关闭。但是,最终,操作系统将终止该进程,这将终止所有仍在运行的线程。

.NET 中的线程可以分为前台线程或后台线程。如果您询问的线程可以突然终止而不会对您的服务所做的任何撤消“伤害”,请将它们标记为background threads,这样它们就不会阻止进程终止。

【讨论】:

    【解决方案2】:

    如果您不终止线程,但正确处理 ServiceStop 消息,则其他线程会继续运行约 20 秒,然后操作系统会终止服务进程,从而终止沿途的线程。

    一般来说似乎没有任何伤害。

    【讨论】:

    • 那里有很多编辑;)谢谢。这是我通过观察收集到的。我想我想知道为什么会有 20 秒的延迟?我一直认为服务管理器在进程退出时认为服务“已停止”,但事实并非如此。它是否造成任何伤害取决于线程被杀死时正在做什么,不是吗?
    • '大量编辑的地狱' - 我的 ISP 很垃圾,我一直出错,所以我稍后再次尝试编辑,出错了......我猜 20 秒的延迟是清理它的服务时间,如果它需要这样做。 “伤害”,嗯,是的。我唯一尝试过的是 100% CPU 循环和 Sleep(aLot) 循环,作为测试 - 没有发生任何意外:stackoverflow.com/questions/10311750/…
    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    相关资源
    最近更新 更多