赢得';t运行多个服务

本文关键字:服务 运行 赢得 | 更新日期: 2023-09-27 18:26:16

我在Visual Studio 2012中创建了一个Windows服务,该服务在执行时应运行2个服务。

static void Main()
    {
        // creates an array to hold all services that will run in this application
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        {
            // services added here
            new Service1(),
            new Service2()
        };
        ServiceBase.Run(ServicesToRun);
    }

我已经在各种论坛上阅读了各种可能的答案,等等,但我还没有找到一个适合我的工作解决方案。

我为每个服务添加了一个服务安装程序,我还有一个项目安装程序。

当我通过开发人员命令提示符安装服务时,我可以在计算机管理器中看到Windows服务,但我也可以看到Service1和Service2。

当我运行Windows服务时,它将只运行Service1而不运行Service2。但是,Service1和Service2都可以单独启动。

有什么建议吗?已经有一段时间了!

编辑

在Service1和Service2 OnStart()中,我有以下代码:

CheckService();
        try
        {
            motorTimer = new Timer();
            // timer sets intervals for when quotes are checked after start up
            motorTimer .Elapsed += new ElapsedEventHandler(QuoteTimerElapsed);
            motorTimer .Interval = Convert.ToDouble(ConfigurationSettings.AppSettings["ServiceCheckInterval"]);
            motorTimer .Start();
        }
        catch (Exception ex)
        {
            MotorServiceCheckLogDetail(ex.ToString());
            OnStop();
        }

赢得';t运行多个服务

为了回答我的问题,我采取了以下方法。这可能并不完美,我稍微改变了我的方法,但这是我能够让我的服务按照我想要的方式工作的一种方式。

我没有创建一个在其中运行多个"服务"的服务,而是创建了一个实例化各种类的服务。我能够在这些类中包含所需的功能,并在需要时调用该类。

正如我所说,这不是我最初问题的完美答案,但这是我发现的一个变通办法,因此,如果其他人阅读这篇SO帖子,它可能会对他们有所帮助。

我已经听说/读到人们在windows服务中使用计时器时面临的一些问题。我建议在OnStart方法中启动一个使用集成延迟的循环的任务,而不是使用计时器。类似以下内容:

Task _task;
CancellationTokenSource _terminator;
protected override void OnStart()
{
     _terminator = new CancellationTokenSource();
     _task = Task.Factory.StartNew(TaskBody, _terminator.Token);
}
private void TaskBody(object arg)
{
     var ct = arg as CancellationToken;
     if (ct == null) throw new ArgumentException();
     while(!ct.sCancellationRequested)
     {
         YourOnTimerMethod();
         ct.WaitHandle.WaitOne(interval)
     }
}
public override void OnClose()
{
    _terminator.Cancel();
    _task.Wait();
}

我也遇到了同样的问题。似乎只有在传递给ServiceBase.Run.的第一个服务上才调用OnStart方法