3

我修改了一个一直在预先启动的工作 Windows 服务。添加 System.Management 引用后,它现在有时不会自动启动。我收到以下错误:

无法启动服务。System.Runtime.InteropServices.COMException (0x80010002):调用被消息过滤器取消。(来自 HRESULT 的异常:0x80010002 (RPC_E_CALL_CANCELED))

我在 SO 上找到了另一个帖子,有人遇到同样的问题。

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

但是,建议的解决方案是在它所依赖的服务启动后启动该服务。但是,当我转到我的服务的 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))

4

4 回答 4

8

我自己也遇到过这个问题,显然它只发生在 Windows XP 上(不在 Vista 或 Win 7 上)。要解决此问题,您需要向 Windows Management Instrumentation 服务添加依赖项。只需三个简单的步骤即可将此依赖项添加到现有服务中:

  1. 打开命令提示符(Windows+R -> cmd -> 回车)
  2. 类型:sc config "NAME_OF_YOUR_SERVICE" 依赖 = winmgmt
  3. 按回车,你应该看到:[SC] ChangeServiceConfig SUCCESS

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

于 2012-11-19T13:00:37.927 回答
1

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

于 2010-03-08T20:56:11.260 回答
0

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

于 2010-03-08T21:17:44.687 回答
0

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

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

于 2010-03-08T23:08:37.637 回答