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

时间:2010-03-08 20:41:22

标签: .net windows service system.management

我修改了一个一直在预先启动的工作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选项卡时,我看到:

alt text

我应该只使用将线程置于睡眠状态的变通方法,还是有更合适的方法让这个服务正确启动?这是因为.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 个答案:

答案 0 :(得分:8)

我自己遇到过这个问题,显然它只出现在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
  4. 重新启动计算机,您的服务现在应该正确启动。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果您依赖其他服务,请使用sc.exe将您的服务配置为在依赖项之后启动。这不能通过服务小程序完成。

答案 3 :(得分:0)

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

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