我修改了一个一直在预先启动的工作Windows服务。添加System.Management引用后,它现在有时不会自动启动。我收到以下错误:
无法启动服务。 System.Runtime.InteropServices.COMException (0x80010002):呼叫被取消了 消息过滤器。 (例外 HRESULT:0x80010002 (RPC_E_CALL_CANCELED))
我在SO上找到了另一篇帖子,有人遇到同样的问题。
Why won't my .Net Windows service start automatically after a reboot?
但是,建议的解决方案是在服务依赖的服务启动后启动服务。但是,当我转到我的服务的Dependencies选项卡时,我看到:
我应该只使用将线程置于睡眠状态的变通方法,还是有更合适的方法让这个服务正确启动?这是因为.NET在我的服务开始之前还没有启动吗?
谢谢,
托梅克
编辑:我添加了一个try-catch语句来捕获异常。这是我添加到我的服务的OnStart()方法的代码(这是抛出异常的地方)
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);
}
该服务现在开始但没有我添加的功能。我是.NET的新手,但是我从网上找到的样本中获取了观察者代码,所以我很确定它是正确的。事件日志显示相同的异常:
无法创建睡眠/恢复观察者呼叫被消息过滤器取消。 (来自HRESULT的异常:0x80010002(RPC_E_CALL_CANCELED))
答案 0 :(得分:8)
我自己遇到过这个问题,显然它只出现在Windows XP上(不在Vista或Win 7上)。 要解决此问题,您需要向Windows Management Instrumentation服务添加依赖项。 将此依赖项添加到现有服务只需三个步骤即可完成:
重新启动计算机,您的服务现在应该正确启动。
答案 1 :(得分:1)
问题不在于服务本身,而是您添加引用的新组件抛出了未处理的异常(消息过滤器取消了调用)。使用您添加的任何代码对该错误消息进行故障排除,和/或进行更好的错误处理,以便该组件中的错误不会冒泡到顶部并导致服务停止: - )
答案 2 :(得分:0)
如果您依赖其他服务,请使用sc.exe将您的服务配置为在依赖项之后启动。这不能通过服务小程序完成。
答案 3 :(得分:0)
我在创建ManagementEventWatcher之前(在try语句之前)最终使用了Thread.Sleep(10000)
这是一种解决方法,但确实解决了这个问题。