赢得';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();
}
为了回答我的问题,我采取了以下方法。这可能并不完美,我稍微改变了我的方法,但这是我能够让我的服务按照我想要的方式工作的一种方式。
我没有创建一个在其中运行多个"服务"的服务,而是创建了一个实例化各种类的服务。我能够在这些类中包含所需的功能,并在需要时调用该类。
正如我所说,这不是我最初问题的完美答案,但这是我发现的一个变通办法,因此,如果其他人阅读这篇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方法