C# 单实例服务
我有一个服务,我希望它成为单实例,因为当我单击services.msc上的restart时,该服务的新实例将在旧实例尚未完成时启动(因为它必须执行一些操作) 完成服务的代码如下所示:C# 单实例服务,c#,service,single-instance,C#,Service,Single Instance,我有一个服务,我希望它成为单实例,因为当我单击services.msc上的restart时,该服务的新实例将在旧实例尚未完成时启动(因为它必须执行一些操作) 完成服务的代码如下所示: protected override void OnStop() { Log.Info("STOPPING SERVICE"); //Wait working threads to finish _Worker.Die(); //Kill inner processes stil
protected override void OnStop()
{
Log.Info("STOPPING SERVICE");
//Wait working threads to finish
_Worker.Die();
//Kill inner processes still running (sometimes some processes hang up and is the only way to kill them...
ProcessUtility.KillTree(System.Diagnostics.Process.GetCurrentProcess().Id);
//Call parent's class Stop
base.OnStop();
}
该类是ServiceBase的一个子类
如何使新实例仅在旧实例完成时启动
thx stackpowerflowers 顺便说一句,我不知道Worker是什么类型,但通常在等待线程终止调用时,调用是
join()
。您可能需要检查主线程是否正在等待工作线程终止
有两个问题,首先,你应该弄清楚为什么你的服务没有正确终止。一旦你明白了这一点,你就可以通过使用互斥来阻止任何额外的实例运行。我在谷歌上找到的一篇文章解释了这个实现,它甚至引用了Jon Skeet。那家伙到处都是
看看这门课。这使您可以创建一个类似锁的同步原语,它可以跨进程工作
试试这个名字;在OnStart上创建一个名为“MYSERVICENAME”的互斥体;在顶部释放它。在早期服务的顶部释放互斥锁之前,后续服务的启动不会继续超过互斥锁。FYI工作者是一个队列使用者,根据配置运行随机数量的线程。