单线程,单线程泵式等待导致Windows服务启动出现1

这几天,在做一个基于C#的定时工作的Windows服务中,在Xp下调试启动是正常的,但是2003下启动速度很慢,并且系统报错(如下):
还有就是服务状态是已经启动。但是在提示窗口下面的启动,停止,恢复,暂停。是灰色的,不能启动。在禁止的状态下,也都是灰色的。
对于“错误1053:服务没有及时响应启动或控制请求”,我郁闷了一下午,后来在2003下调试发现是单线程泵式等待,导致服务在60秒没有响应,所以 Windows 服务控制器会将此服务标记为“超时”。
现在我将所遇到问题以及造成的原因,贴出来供大家参考!
在一个定时工作的Windows服务中,有一个线程时钟 UpdateTimer,定时执行ThreadDemo方法(如下),
现象是在ThreadDemo运行时,其中有一个方法运行超过60秒,系统在启动就报错

在VS 2005运行下,不确定的出现这个提示:
由于ThreadDemo是单线程单线程单元 (STA) 线程不发送消息。
可能是ThreadDemo中的某一个方法,由于长时间的未操作而且不允许发送消息队列,
如果 STA 线程通过公共语言运行库或第三方控件直接或间接使用 COM 互操作性,MDA 将被激活。
所有单线程单元(STA)线程都是使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。有的时候出现,不是总出现。因此,就会收到contextSwitchDeadlock MDA错误信息。
而当您启动或停止托管 Microsoft Windows 服务时,ServiceBase 类直接从 Advapi32.dll 文件的 ScDispatcherLoop 中定义的 Service 命令处理程序调用 OnStart 方法。60 秒之后,如果ScDispatcherLoop 线程未准备好从服务控制管理器接收新的服务命令,则 Windows 服务控制器会将此服务标记为“超时”。因此,就会收到 "错误 1053:服务没有及时响应启动或控制请求" 错误信息。
解决方法就是使用多线程,将ThreadDemo中方法使用多线程,这样就不会出现由于某一个线程,由于长时间的未操作而且不允许发送消息队列,也不会出现Windows 服务,因长时间未响应而标记为“超时”。但多线程带来问题就是不好调试代码。
以上是个人分析,希望给大家带来帮忙,谢谢!
Tags:  单线程多线程 单线程下载工具 单线程下载 单线程

延伸阅读

最新评论

发表评论