Windows Service的一个致命错误
最近在开发Windows Service过程中,同事发现了Windows Service的一个很奇怪的线程错误。在此写下这一发现以提醒自己以后在开发Windows Service要注意这一陷阱。
具体的错误是这样的:在Windows Service中使用Timer作为定时器以定时启动需要执行的代码。System timer会启动一条非UI线程执行代码。若代码中出现错误,这条非UI线程因错误而死掉。但整个Windows Service并不会因此而停止运行,而是继续启动另一条非UI线程继续运行到出现错误的地方并停止下来。如此不断循环。在这个过程中Windows Service的状态都将会是正常的"Start"。并没有什么异常的状态。但实质上整个Windows Service不会正常地工作。这是一个非常严重的错误。幸好可以再Windows事件查看器中找到一些错误信息。

这次我特地使用了.Net的两种语言:C#/VB进行测试。看是否两种语言都会有以上的问题。具体都实现如下相同的功能:
C#

VB

安装编译好的exe后运行Windows Service manager中的Service

TestService状态是十分正常的“已启动”,而log的结果如下:

根据代码理应会出现“End of Test”,但这里没有出现证明程序在Test函数中已经出错并停止。不断出现的“Start to Test”证明程序并没有因为Test函数的错误而停止,而是继续工作。由此我们便可以了解到这一严重的错误:程序出错了但表现十分正常!

浙公网安备 33010602011771号