2017-08-15 50 views
1

我試圖運行一些控制檯應用程序,Windows服務,我也跟着this question,我做了一些修改,以使其適合於我的應用程序。C#運行控制檯應用程序作爲Windows服務 - 該服務沒有響應錯誤

我主要的代碼看起來像這樣:

public static class Program 
{ 
    public class Service : ServiceBase 
    { 

     public Service(string serviceName) 
     { 
      this.ServiceName = serviceName; 
     } 

     protected override void OnStart(string[] args) 
     { 
      Program.Start(args); 
     } 

     protected override void OnStop() 
     { 
      Program.Stop(this.ServiceName); 
     } 
    } 
    #endregion 

    static void Main(string[] args) 
    { 
     if (!Environment.UserInteractive) 
      // running as service 
      using (var service = new Service("TestService")) 
       ServiceBase.Run(service); 
     else 
     { 
      // running as console app 
      Start(args); 
     } 
    } 

    private static void Start(string[] args) 
    { 
     while(true) 
     { 
      //DO SOMTHING 
     } 
    } 

    private static void Stop(string serviceName) 
    { 
     //Writing to log that 'serviceName' stopped 
    } 
} 

我試圖運行下面的控制檯應用程序作爲一種服務,通過使用以下步驟:

1)使用命令:sc創建ServiceTestName123 binPath =「路徑到項目調試文件夾中的EXE文件」。

2)使用命令:sc啓動ServiceTestName123 「參數1」。

而且我得到了一個錯誤: 「StartService失敗1053: 服務沒有及時到開始或控制請求」

我瞭解在互聯網上的錯誤,並發現我可以嘗試通過運行另一個線程啓動功能來解決這個問題,所以我更新了的OnStart功能下列功能:

protected override void OnStart(string[] args) 
{ 
    Thread t = new Thread(() => Program.Start(args)); 
    t.Start(); 
} 

試圖重新創建服務後(刪除舊的和創建服務再次用新的OnStart函數)並重新運行它,我得到了相同的錯誤要麼。

順便說一句,當我跑這個代碼作爲控制檯應用程序,一切正常。

可能有人請explaing我什麼我做錯了?

非常感謝。

+1

這是一個一般錯誤消息,你應該檢查確切的錯誤信息Windows事件查看器。 – Winnie

回答

1

我想你的具體步驟,它爲我工作。我將強調我遇到的幾個關鍵點

  1. OnStart應該及時返回。即工作應該發生在一個單獨的過程/線程中。我使用你的代碼線程,它對我很好。
  2. 確保可執行文件位於本地驅動器上,該驅動器可以從您的「本地系統」帳戶進行訪問,而不會有任何許可問題。
  3. 確保在創建服務時提供絕對路徑而不是相對路徑。
  4. 確保sc create ...命令響應回來[SC] CreateService SUCCESS
  5. 檢查服務是在service control panel
  6. 創建確保你可以從service control panel命令行
  7. 此外,打開任務管理器,或試圖之前啓動進程管理器,以確保服務的可執行文件運行與否(無論是由服務控制面板或scm start返回什麼狀態)
  8. 對於調試,我記錄的信息到本地的臨時文件 - 再次注意權限問題的Wi本地系統帳戶。
  9. 如果你要刪除的服務不管是什麼原因,請確保它確實從service control panel
+0

非常感謝,這非常有幫助 – DimDom

0

消失要調試這是怎麼回事,你可以在你的程序非常beggining附加調試啓動。

這樣,你可以檢查你的程序在做什麼。

您還可以檢查Windows永久查看器,窗口正在拋出的錯誤。

把這一行在程序的開始跟蹤:

System.Diagnostics.Debugger.Launch() 
相關問題