0

我尝试使用下面的代码来限制 Windows 服务的第二个实例,但是下面的代码对我不起作用,任何人都可以帮助我。我已经设置了运行服务的时间间隔,即 5 分钟,如果第一个实例启动并运行,5 分钟后第二个实例启动,即使第一个实例没有完成。

static class Program
{
    [STAThread]
    static void Main()
    {

     bool ok;
     System.Threading.Mutex m = new System.Threading.Mutex(true, "ImageImportService", out ok);
        if (!ok)
        {
            return;
        }
        GC.KeepAlive(m);
        if (PriorProcess() != null)
        {
            return;
        }
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
            { 
                new ImageImportService() 
            };
        ServiceBase.Run(ServicesToRun);
    }
    public static Process PriorProcess()
    {
        Process curr = Process.GetCurrentProcess();
        Process[] procs = Process.GetProcessesByName(curr.ProcessName);
        foreach (Process p in procs)
        {
            if ((p.Id != curr.Id) && (p.MainModule.FileName == curr.MainModule.FileName))
                return p;
        }
        return null;
    }
}
4

1 回答 1

1

服务控制管理器是 Windows 的一个组件,如果 Windows 服务已经在运行,则它不允许启动它。只是依靠它。

您需要做的主要事情是永远不要直接启动您的可执行文件。相反,ServiceController在从代码启动服务时使用类,在services.msc手动启动/停止服务时使用控制面板 ( )。

在某些情况下,您可能需要采取额外的步骤来确保服务在停止后不会保留任何资源,从而阻止其自己的后续启动,直到某个较低级别的超时。但是您的问题中没有任何内容表明您已经遇到过此类问题(例如,重新绑定 TCP 端口)。

于 2013-03-25T08:23:27.680 回答