为什么我的.NET Windows服务有时候无法自动启动?

3

我修改了一个之前一直在启动的Windows服务。在添加System.Management引用后,它有时无法自动启动。我收到以下错误:

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

我在这里找到了另一篇帖子,其中有人遇到了同样的问题。

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

然而,建议的解决方法是在依赖服务启动后启动该服务。但是,当我转到我的服务的依赖项选项卡时,我看到:

alt text

我应该只使用将线程休眠的解决方法,还是有更适当的方法可以使此服务正确启动?这是因为.NET尚未在我的服务启动之前启动吗?

谢谢,

Tomek

编辑:我已经添加了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)的异常)


您也可以尝试在ServerFault.com上发布您的问题。 - DOK
由于您现在使用WMI,因此最好等待Windows管理工具服务启动。尝试在安装时将其添加到依赖服务中。 - S.Skov
4个回答

8
我自己也遇到了这个问题,显然只有在Windows XP上出现(而不是在Vista或Win 7上)。 要解决此问题,您需要将依赖项添加到Windows管理工具服务中。 将此依赖项添加到现有服务中的步骤如下:
  1. 打开命令提示符(Windows+R -> cmd -> enter)
  2. 键入:sc config "YOUR_SERVICE_NAME" depend= winmgmt
  3. 按Enter键,您应该会看到:[SC] ChangeServiceConfig SUCCESS
重新启动计算机,您的服务现在应该可以正确启动。

2
这是正确的答案!您还可以将依赖项添加到服务安装程序中。 - Andre Hofmeister

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

@Joel Martinez 我已经添加了 try-catch 但是仍然得到相同的异常(请看我的编辑) - Tomek

0
如果您的服务依赖于另一个服务,可以使用sc.exe配置您的服务在依赖服务启动后启动。这无法通过“服务”应用程序完成。

除了服务应用程序之外,我如何找出我的服务依赖于哪些服务? - Tomek

0

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

这有点像是一个变通方法,但它确实解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接