单实例服务

时间:2009-07-03 17:06:09

标签: c# service single-instance

我有一个服务,我希望它成为单个实例,因为当我点击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 !!

2 个答案:

答案 0 :(得分:1)

顺便说一句,我不知道Worker是什么类型,但通常在等待线程终止调用时join()。您可能想要检查主线程是否实际上正在等待工作线程终止。

两个问题,首先,您应该弄清楚为什么您的服务没有正常终止。一旦弄明白,就可以使用Mutex保持运行任何其他实例。这里解释了这个实现,我在Google上发现了一篇文章,它甚至引用了Jon Skeet。那家伙到处都是!

http://www.ai.uga.edu/~mc/SingleInstance.html

答案 1 :(得分:0)

查看Mutex课程。这使您可以创建一个跨进程的锁定同步原语。

试试这个名字的constructor;在OnStart上创建一个名为“MYSERVICENAME”的互斥锁;在OnStop上发布它。稍后服务的OnStart将不会继续通过互斥锁,直到早期服务的OnStop发布它。