我已经修改了一直在开始的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服务。 将这种依赖关系添加到您现有的服务是通过三个简单的步骤完成的:
重新启动您的计算机,现在您的服务应该正确启动。
问题不在于服务本身,而是您添加引用的新组件引发未处理的异常(调用被消息过滤器取消)。 使用您添加的任何代码来排查错误消息,并且/或者提供更好的错误处理,以便该组件中的错误不会冒泡到顶部并导致服务停止:-)
如果您依赖于另一个服务,我们sc.exe将您的服务配置为在依赖关系之后启动。 这不能通过服务小程序来完成。
在创建ManagementEventWatcher之前(在try语句之前),我最终使用了Thread.Sleep(10000)
这是一种解决方法,但它确实解决了这个问题。