为什么我的.NET Windows服务有时不会自动启动?

我已经修改了一直在开​​始的Windows服务。 添加System.Management引用后,它现在有时不会自动启动。 我得到以下错误:

服务无法启动。 System.Runtime.InteropServices.COMException(0x80010002):调用被消息filter取消。 (从HRESULTexception:0x80010002(RPC_E_CALL_CANCELED))

我在这里发现了另一个post,与有同样问题的人在一起。

为什么重新启动后,我的.Net Windows服务不会自动启动?

但是,build议的解决scheme是在服务开始之后启动服务。 但是,当我转到我的服务的依赖关系选项卡时,我看到:

替代文字

我应该只使用让线程进入睡眠状态的解决方法,或者是否有一个更正确的方式来让服务正常启动? 这是否发生,因为在我的服务启动之前.NET还没有启动?

谢谢,

托梅克

编辑:我已经添加了一个try-catch语句来捕捉exception。 这里是我添加到我的服务的OnStart()方法(这是抛出exception)的代码,

try { _watcher = new ManagementEventWatcher(query); _watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived); _watcher.Start(); } catch (Exception ex) { EventLog.WriteEntry("Could not create Sleep/Resume watcher" + ex.Message); } 

该服务现在开始,但没有我已经添加的function。 我是.NET的新手,但是我从我在网上find的样本中看到了守护程序代码,所以我非常肯定它是正确的。 事件日志显示相同的exception:

无法创build睡眠/恢复观察者通过消息filter取消呼叫。 (从HRESULTexception:0x80010002(RPC_E_CALL_CANCELED))

我自己有这个问题,显然它只发生在Windows XP(不在Vista或Win 7上)。 要解决此问题,您需要将依赖关系添加到Windows Management Instrumentation服务。 将这种依赖关系添加到您现有的服务是通过三个简单的步骤完成的:

  1. 打开命令提示符(Windows + R – > cmd – >输入)
  2. 键入:sc config“NAME_OF_YOUR_SERVICE”depend = winmgmt
  3. 按回车键,你会看到:[SC] ChangeServiceConfig SUCCESS

重新启动您的计算机,现在您的服务应该正确启动。

问题不在于服务本身,而是您添加引用的新组件引发未处理的异常(调用被消息过滤器取消)。 使用您添加的任何代码来排查错误消息,并且/或者提供更好的错误处理,以便该组件中的错误不会冒泡到顶部并导致服务停止:-)

如果您依赖于另一个服务,我们sc.exe将您的服务配置为在依赖关系之后启动。 这不能通过服务小程序来完成。

在创建ManagementEventWatcher之前(在try语句之前),我最终使用了Thread.Sleep(10000)

这是一种解决方法,但它确实解决了这个问题。