2009-07-03 176 views
0

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

看一看的Mutex类。这使您可以创建跨进程的锁式同步原语。

试试这个constructor它取一个名字;在OnStart上创建一个叫做“MYSERVICENAME”的互斥体;在OnStop上发布它。在较早的服务的OnStop释放它之前,较晚服务的OnStart不会继续超越该互斥体。

1

顺便说一句,我不知道什么类型的工人是,但通常当你等待线程终止呼叫是join()。您可能需要检查主线程是否实际等待工作线程终止。

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

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

+0

仅供参考该工作人员是队列使用者,根据配置运行随机数量的线程。 – 2009-07-04 11:39:27