2013-03-25 103 views
0

我用下面的代码,以限制Windows服务的第二个实例尝试过,但下面的代码是不是为我工作,任何人都可以帮助我。 我已经把时间间隔来运行服务,即5个薄荷糖,如果第一个实例启动并运行,5个第二个实例启动后即使第一个实例没有完成。Windows服务 - 只有一个实例,以允许一次

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; 
    } 
} 
+5

相同服务的2个实例可能运行吗? – 2013-03-25 05:57:44

+0

它不起作用?究竟什么是失败? – 2013-03-25 06:06:07

+0

我已经放了时间间隔来运行服务,也就是5分钟,如果第一个实例启动并运行,那么5分钟的第二个实例即使第一个实例没有被启动也是如此。 – user2061199 2013-03-25 06:50:13

回答

1

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

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

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