为什么启动一个服务会启动其他服务(一个exe中的多个服务)?

时间:2014-10-01 07:20:42

标签: c# windows windows-services

我有一个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();
    }

    ...
    ...
}

2 个答案:

答案 0 :(得分:1)

您开始使用服务的构造函数。在Main方法中调用该构造函数。这意味着您的代码会在流程开始后立即开始工作。

Enabled的{​​{1}}属性表示将其设置为true与导致问题的System.Timers.Timer相同。

答案 1 :(得分:0)

要在服务管理器中查看其他服务是否在您启动后正在运行,您需要刷新视图(上下文菜单)。

关于您的问题,您的代码没有任何问题,以及它应该如何运作:

  

调用Run(ServiceBase [])后,服务控制管理器ISSUES   START COMMANDS,导致调用OnStart方法   服务。在Start命令完成之前,服务不会启动   执行。   (msdn

要逐个启动服务,您需要单独安装它们并在每个

中调用 ServiceBase.Run(singleService)