我有一个服务,我希望它成为单个实例,因为当我点击services.msc上的重新启动时,服务的新实例在旧实例仍然没有完成时启动(因为它必须执行一些动作)。
完成服务的代码如下所示:
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 !!
答案 0 :(得分:1)
顺便说一句,我不知道Worker是什么类型,但通常在等待线程终止调用时join()
。您可能想要检查主线程是否实际上正在等待工作线程终止。
两个问题,首先,您应该弄清楚为什么您的服务没有正常终止。一旦弄明白,就可以使用Mutex保持运行任何其他实例。这里解释了这个实现,我在Google上发现了一篇文章,它甚至引用了Jon Skeet。那家伙到处都是!
答案 1 :(得分:0)
查看Mutex课程。这使您可以创建一个跨进程的锁定同步原语。
试试这个名字的constructor;在OnStart上创建一个名为“MYSERVICENAME”的互斥锁;在OnStop上发布它。稍后服务的OnStart将不会继续通过互斥锁,直到早期服务的OnStop发布它。