【发布时间】:2014-10-01 07:20:41
【问题描述】:
我有一个 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();
}
...
...
}
【问题讨论】:
-
如果服务(控制)管理器没有显示它们已启动,你怎么知道它们已经启动?
-
“开始”是什么意思?其他服务是否在不应该收到
Start事件时收到了?还是他们的代码在没有收到Start事件的情况下开始执行?您是否可能在构造函数中开始处理而不等待 Start 事件?请发布处理Start和Stop事件的代码 -
@Christian.K:我知道他们是从查看事件日志开始的。
-
@PanagiotisKanavos 代码已发布。
-
我想我找到了问题的根源。是
Enabledproperty of theSystem.Timers.Timer表示设置它true与导致问题的Start()相同。他们应该在描述中说明,而不是在备注
标签: c# windows windows-services