我的Windows服务正在使用一个Thread(不是一个计时器),它总是循环并在每个循环中休眠1秒钟:evet.WaitOne(interval);
当我启动服务时,它工作正常,我可以在任务管理器中看到它正在运行,消耗和释放内存,消耗处理器等等 这是正常的,但过了一段时间(随机的时间)服务只是停止! 它仍然存在于任务管理器中,但它现在不消耗任何处理器工作,并且它对内存的消耗不会改变。它只是(死了但仍然在任务管理器中像僵尸一样)。
我知道在运行服务期间可能发生了很多异常(它确实做了很多事情)但是所有这些异常都是在Try catch块中处理的,那么为什么我的“always looping”线程会停止? 这个帖子每次循环都会记录,当他以这种方式离开时,他没有记录任何东西(当然)
答案 0 :(得分:0)
您是否尝试过使用Thread.Sleep(interval)而不是等待句柄?
答案 1 :(得分:0)
如果您使用的是.Net 2.0或更高版本,后台线程中的未处理异常应该完全终止该进程。所以情况可能并非如此。
为了确保您服务中发生了什么,我建议使用windbg,就像我刚才在另一个问题上所描述的那样what can cause asp.net to stop responding
我建议精确定位工作线程并在其上发出!CLRStack
以查看持有它的内容。如果线程无处可寻,它可能已经崩溃(但是你的托管进程也应该崩溃)或者它可能因某种原因而退出。在这种情况下,更慷慨地使用日志。
答案 2 :(得分:0)
我发现在某个时候会抛出异常并且异常是打开Dialog(终止应用程序或取消调试)。 这个对话框很奇怪,因为我100%确定我的所有服务代码都是安全的,并且处理了所有异常。 但似乎我从这个服务调用的第三方DLL之一是调用一个不安全的Win32库,这是抛出异常(我直到现在还不确定,但这是最有可能的,因为如果我的代码导致例外,服务将终止)。
要在Windows服务运行时发现此对话框,我在(本地系统帐户)下运行服务,然后选中了框(允许服务与桌面交互),没有这个我永远不会看到该对话框,即使它是由被调用的DLL显示。
感谢所有试图提供帮助的人