ServiceBase[] servicesToRun;
servicesToRun = new ServiceBase[]
{
new Service1(),
new Service2()
};
ServiceBase.Run(servicesToRun);
这将如何运作? Service1 是否会运行,以及何时运行OnStart()
完成了,Service2的OnStart()
将运行,还是两者同时运行?
如果是这样的话,我明确想要 Service1OnStart
运行前要做的事情Service2.OnStart()
,我该怎么走?
这能解决问题吗:
ServiceBase.Run(new Service1())
ServiceBase.Run(new Service2())
你误解了什么ServiceBase.Run()
事实上确实如此。
From 文档 https://msdn.microsoft.com/en-us/library/6esb073b(v=vs.110).aspx:
使用服务控制管理器 (SCM) 注册多个服务的可执行文件。
顺序是这样的:
- 收到一项(或可能两项)服务的启动请求。
- SCM 启动可执行文件。
- 您的主函数调用 ServiceBase.Run()。
- SCM 在新线程中为与启动请求匹配的服务调用 OnStart()。除非两个服务都正在启动,否则 OnStart() 将not被叫去换另一位!
如果两个服务are启动后,调用 OnStart() 的顺序是不确定的,除非一个服务已配置为依赖于另一个服务。配置这样的依赖关系是确保特定顺序的唯一安全方法,任何诡计(例如在一个 OnStart() 中等待来自另一个 OnStart() 的信号)都可能导致 SCM 死锁。
如果仅启动了一个服务,稍后又启动了另一个服务,则 SCM 将在此时调用第二个服务的 OnStart()。
在服务报告它已停止之前,对 ServiceBase.Run() 的调用不会返回。如果您注册了不止一项服务,则直到所有服务停止后才会返回。此时您的进程预计将退出。
请注意,您的第二个代码段肯定是错误的。在 Service1 停止之前,第一个调用不会返回,此时第二个调用是非法的,并且可能会失败 - 无论如何,它肯定不会做任何有用的事情。
另请注意,如果这两个服务无法独立运行,那么一开始就有两个服务可能就没有意义。我能想到的唯一明智的情况是,如果您希望用户能够在保持 Service1 运行的同时停止和启动 Service2。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)