C# 单实例服务

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

我有一个服务,我希望它成为单实例,因为当我单击services.msc上的restart时,该服务的新实例将在旧实例尚未完成时启动(因为它必须执行一些操作)

完成服务的代码如下所示:

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工作者是一个队列使用者,根据配置运行随机数量的线程。