【问题标题】:Windows Service suddenly doing nothingWindows 服务突然什么都不做
【发布时间】:2009-11-24 12:09:47
【问题描述】:

我的 Windows 服务正在使用一个线程(不是计时器),它总是循环并在每个循环中休眠 1 秒,使用:evet.WaitOne(interval);

当我启动服务时,它工作正常,我可以在任务管理器中看到它正在运行、消耗和释放内存、消耗处理器......等等 这都是正常的,但一段时间后(随机时间)服务就会停止! 它仍然存在于任务管理器中,但它现在没有消耗任何处理器工作,并且它对内存的消耗没有改变。它只是(死了但仍然像僵尸一样在任务管理器中)。

我知道在运行服务期间可能发生了许多异常(它确实在做很多事情)但是所有这些异常都在 Try catch 块中处理,那么为什么我的“总是循环”线程停止了??? 该线程还会在每次循环时记录,当他以这种方式冻结时,他不会记录任何内容(当然)

【问题讨论】:

  • 也许您可以总结一下您的服务正在执行的任务。网络访问、磁盘访问、网络磁盘访问等...如果您使用的是FileSystemWatcher,这可能是原因(在OnError 中重新初始化)
  • 您是否尝试检查事件日志?
  • 谢谢,我检查了事件日志,有一个错误来自名为:.NET 2.0 运行时错误报告,如下所示:事件源:.NET 运行时 2.0 错误报告事件类别:无事件 ID: 1000 我无法调试它,因为我无法准确预计什么时候会发生这种情况,它可能会在 2 分钟或 2 天后发生/跨度>

标签: multithreading windows-services


【解决方案1】:

您是否尝试过使用 Thread.Sleep(interval) 代替等待句柄?

【讨论】:

  • 使用 Thread.Sleep 不是一个好习惯,因为它涉及到更多的工作。等待活动 - 就像原始海报一样 - 更好。
  • 不,但我认为使用 evet.WaitOne(interval);使服务能够响应任何外部请求(例如停止服务的请求)
【解决方案2】:

如果您使用的是 .Net 2.0 或更高版本,后台线程中未处理的异常应该会完全终止进程。所以不太可能。

为了确保您的服务中发生了什么,我建议使用 windbg,就像我刚才在另一个问题 what can cause asp.net to stop responding 中描述的那样

我建议查明工作线程并在其上发出!CLRStack 以查看它持有什么。如果找不到线程,它可能已经崩溃(但是您的托管进程也应该崩溃)或者它可能由于某种原因退出。在这种情况下,请更慷慨地使用日志记录。

【讨论】:

  • 我会尝试,但我想知道“一直在运行”的线程如何停止!我正在使用:while(true) { } 所以它应该永远循环,如果它崩溃了,那么(就像你说的那样)整个服务应该崩溃。
  • 那么它可能会卡在等待某些东西(IO,另一个同步对象,等等)。尝试使用调试器附加,或在其上触发 windbg。
【解决方案3】:

我发现有时会抛出异常,并且该异常正在打开一个对话框(终止应用程序或取消调试)。 这个对话框很奇怪,因为我 100% 确定我的所有服务代码都是安全的,并且所有异常都得到了处理。 但似乎我从该服务调用的第 3 方 DLL 之一正在调用一个不安全的 Win32 库,该库引发了该异常(直到现在我还不确定这一点,但这是最有可能的,因为如果我的代码导致异常则服务将终止)。

为了在 Windows 服务运行时发现此对话框,我让该服务在(本地系统帐户)下运行,并选中了复选框(允许服务与桌面交互),没有这个我永远不会看到该对话框,即使它是由被调用的 DLL 显示。

感谢所有试图提供帮助的人

【讨论】:

    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 2018-12-08
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多