【问题标题】:Why starting one service does start others (multiple services in one exe)?为什么启动一项服务会启动其他服务(一个 exe 中的多个服务)?
【发布时间】: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 事件?请发布处理StartStop 事件的代码
  • @Christian.K:我知道他们是从查看事件日志开始的。
  • @PanagiotisKanavos 代码已发布。
  • 我想我找到了问题的根源。是Enabled property of the System.Timers.Timer 表示设置它true 与导致问题的Start() 相同。他们应该在描述中说明,而不是在备注

标签: c# windows windows-services


【解决方案1】:

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

System.Timers.TimerEnabled 属性表示将其设置为 true 与导致问题的 Start() 相同。

【讨论】:

  • 找到问题的真正原因。我不知道EnabledSystem.Timers.Timer 也是Start()s 它。 MSDN 对其进行了描述:如果 Timer 应该引发 Elapsed 事件,则为 true;否则为假。默认为false,不清楚。他们的 Remark 部分阐明了这一点
  • 我现在在问题下方看到您的 cmets。这基本上就是这个答案所说的。不过,我已经添加了您的声明。
  • BCL 团队犯了一个错误,有时会添加多余的成员。例如 FileStream.Close 和 Dispose 做同样的事情。这会导致很多混乱和双重调用。启用和启动也是如此。
【解决方案2】:

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

关于您的问题,您的代码没有任何问题,它应该是这样工作的:

调用 Run(ServiceBase[]) 后,服务控制管理器会出现问题 START COMMANDS,这会导致调用 服务。在启动命令执行之前,服务不会启动 执行。 (msdn)

要一个一个启动你的服务,你需要单独安装它们并在每个中调用ServiceBase.Run(singleService)

【讨论】:

  • 服务确实在运行(从事件日志验证),但服务管理器没有显示任何状态(尝试刷新、关闭+重新打开)。如果我做 5 个不同的项目并安装服务,那肯定行得通;但是Run([]) 方法有什么意义呢?
  • @mshsayem Run([]) 同时启动服务,我想如果你需要一次启动一堆服务很有用,特别是如果它们是同一类型并且做基于某种配置的相关事物,并且您的所有服务都有一个 .exe 文件。问题:您的 Main() 方法位于哪个服务类中?其中之一?他们都是?您所说的“独特”服务是什么意思(我问的是功能)?
猜你喜欢
  • 1970-01-01
  • 2019-11-15
  • 2023-04-05
  • 1970-01-01
  • 2017-02-13
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多