【问题标题】:The service could not be started, but does start?服务无法启动,但启动了吗?
【发布时间】:2011-05-10 08:14:11
【问题描述】:

我编写了一个小型 Windows 服务,希望每天在我的 Windows Server 2008 上运行。该服务是用 C# 编写的。

  • 代码在正常情况下运行良好 Windows 窗体。
  • 当我从“服务管理”窗口 (services.msc) 启动和停止该服务时,该服务的工作方式应有尽有。

但是在命令行上运行它时:

net start Service1

我得到以下信息:

The Service1 service is starting........  The Service1 service could not be started.

The service did not report an error.

More help is available by typing NET HELP:SG 3534.

但奇怪的是,该服务仍在运行,在“服务”屏幕中,我仍然看到它正在启动,直到它完全启动。当我之后尝试停止服务时,我得到:

The service could not be controlled in its present state.

More help is available by typing NET HELPMSG 2189

然后服务停止。有没有办法解决这个问题?我已经成功地调试了服务,没有任何问题,代码有效。但是在调试过程中,命令控制台上仍然会发生同样的事情,而我仍然能够进一步调试。

这就像 onStart() 方法有某种超时..我不知道..我对 Windows 服务相当陌生(这是我的第一个)。我确实在 onStart() 方法中编写了所有代码,也许这不是最好的主意,但我不知道在哪里输入它。

如果有人可以提供帮助,我将不胜感激。

【问题讨论】:

  • 也许您在某处返回了错误的错误代码
  • Johann Blais 在正确的道路上帮助了我。在用正确的术语进行一些研究后,我也发现了这一点:“问题是 OnStart 和 OnStop 方法必须在 1 分钟内将控制权返回给服务控制管理器,以便服务控制管理器识别服务正在运行或已经停了。”我的代码运行时间超过一分钟。

标签: c# command-line service windows-services


【解决方案1】:

OnStart 事件用于启动将负责处理的后台线程。如果 OnStart 方法完成且没有错误,则服务管理器假定服务已成功启动。因此,OnStart 应该尽快返回。

然后使用 OnStop 方法停止后台处理。成功的 OnStop 会告诉服务管理器该服务已正确关闭。

【讨论】:

  • 我把它变成了一个线程,这实际上起到了作用。非常感谢。我现在唯一想知道的是,是否有可能在线程完成工作后自动停止服务?
  • 或者我什至需要停止它?我的意思是,如果我创建一个启动和停止我的服务的 .bat 文件,线程仍然会运行,对吗?或者这不是一种好的工作方式?
  • 某些 Windows 服务在完成处理后会自动停止。您可以决定做同样的事情(通过从服务中调用 Stop 方法),但无论如何,请确保您在 OnStop 方法中优雅地停止后台处理。
  • 感谢您的回答,他们对我有很大帮助。最后一件事,我认为 myThread.abort() 不是一种优雅地停止后台处理的方法吗?使用 ManualResetEvent 是否可以正确结束线程?
  • Thread.Abort 应该避免。您可以定期从线程函数中检查是否设置了标志(布尔或其他),如果是,则退出该函数。您可以通过 OnStop 方法设置此标志。
猜你喜欢
  • 2011-08-05
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多