我有一个Windows服务,它有一个定时器,每隔30秒触发一次方法。
然后该方法调用thread.sleep(),当它完成时调用thread.start();
方法中的所有代码都包含在try / catch中,除了调用踏板睡眠/开始。
由于某种原因,服务停止工作,但如果我回收它或将其设置为在崩溃时回收它可以正常工作。
如何诊断问题?
是否有其他事件,如OnCrash或somethign,我可以深入挖掘堆栈跟踪?
答案 0 :(得分:0)
不,没有,但是为什么不自己进行一次尝试/捕获并在异常发生时记录它?
另外,我发现睡眠和开始的呼叫非常可疑。您通常不应该使用这些调用进行同步。你为什么打这些电话?
答案 1 :(得分:0)
我认为首先你要找到崩溃的原因。 OnCrash?好吧,如果它崩溃了,我猜也没什么可说的。
答案 2 :(得分:0)
它的计时器! 。 摆脱它,你的问题将得到解决。
查看此post了解详情。
你最好这样做......
While (stopSignal = False)
'do your work'
Thread.Sleep(yourInterval)
End While
编辑:如果您想调试服务而不必通过附加调试器而受到影响,那么请执行this。
无论您是否不同意这一点,MS已确认其为bug,并且删除计时器是避免此问题的唯一方法。如果可以帮助,您也不应该使用异常作为程序流控制(Catch and Retry)。
答案 3 :(得分:0)
Windows服务与普通应用程序相同,只是执行不同。那么问问自己,你的普通应用程序是否没有崩溃,但是停止工作会导致什么?许多事情都会浮现在脑海中,比如锁定问题,并发问题等等......
虽然没有OnCrash事件,但我为Windows服务做的事情是将所有逻辑放在一个单独的程序集中,并使用简单的启动方法,这样我就可以在控制台应用程序中托管它并轻松地进行测试并转移到Windows服务也不太难。
您的另一个选择是attach the Visual Studio debugger to the Windows service并正常调试。
答案 4 :(得分:0)
您可以使用Microsoft的Debug Diagnostic Tool v1.1监视服务并在崩溃时创建转储。然后你可以调试转储。