2013-03-25 67 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端口)。