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 的子类。

如何使新实例仅在旧实例完成后启动?

谢谢stackpowerflowers!

4

2 回答 2

1

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

两个问题,首先,您应该弄清楚为什么您的服务没有正确终止。一旦弄清楚这一点,您就可以通过使用互斥锁来阻止任何其他实例运行。这里解释了实现,我在 Google 上找到的一篇文章,它甚至引用了 Jon Skeet。那家伙无处不在!

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

于 2009-07-03T17:19:26.960 回答
0

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

试试这个带有名字的构造函数;在 OnStart 上创建一个名为“MYSERVICENAME”的互斥锁;在 OnStop 上释放它。后一个服务的 OnStart 不会继续越过互斥锁,直到前一个服务的 OnStop 释放它。

于 2009-07-03T20:46:57.420 回答