我有一个Windows服务项目,包含5个不同的服务(单个exe)。在Main
方法中,我使用ServiceBase.Run([])
来注册这些:
static void Main()
{
var servicesToRun = new ServiceBase[]
{
new ServiceA(),
new ServiceB(),
new ServiceC(),
new ServiceD(),
new ServiceE(),
};
ServiceBase.Run(servicesToRun);
}
安装后,我在服务管理器(services.msc)中看到5个不同的服务。很好,但似乎如果我只启动一项服务(比如serviceA),其他4项服务也会启动;虽然服务管理器没有针对这些服务显示started
状态(也刷新了视图)。如果我手动启动另一个服务(比如serviceB)然后停止它,似乎serviceB不再运行,但其他3个服务正在运行。
知道为什么会这样吗?
顺便说一句:所有服务都有这种模式:
public partial class ServiceA : ServiceBase
{
private static readonly Timer MyTimer = new Timer(60000);
public ServiceA()
{
InitializeComponent();
// other initializations
...
...
MyTimer.Elapsed += <DoSomeTaskFunction>
MyTimer.AutoReset = true;
MyTimer.Enabled = true;
}
protected override void OnStart(string[] args])
{
myEventLog.WriteEntry("Started...");
MyTimer.Enabled = true;
MyTimer.Start();
}
...
...
}
答案 0 :(得分:1)
您开始使用服务的构造函数。在Main
方法中调用该构造函数。这意味着您的代码会在流程开始后立即开始工作。
Enabled
的{{1}}属性表示将其设置为true与导致问题的System.Timers.Timer
相同。
答案 1 :(得分:0)
要在服务管理器中查看其他服务是否在您启动后正在运行,您需要刷新视图(上下文菜单)。
关于您的问题,您的代码没有任何问题,以及它应该如何运作:
调用Run(ServiceBase [])后,服务控制管理器ISSUES START COMMANDS,导致调用OnStart方法 服务。在Start命令完成之前,服务不会启动 执行。 (msdn)
要逐个启动服务,您需要单独安装它们并在每个
中调用 ServiceBase.Run(singleService)