2011-09-13 109 views
11

我有一個Windows服務,我正在嘗試調試。現在,即使當前的代碼用於工作,它也無法啓動。錯誤是:Windows服務將無法啓動(錯誤1053)

Windows不能在本地計算機

錯誤1053年上啓動的MyService服務:該服務沒有啓動或控制及時 請求作出迴應。

爲了找出這個錯誤,我試着評論一切。主要方法如下:

TextWriter tt = new StreamWriter(@"C:\startup.text", true); 
tt.WriteLine("Starting up the service"); 
tt.Close(); 

ServiceBase[] ServicesToRun; 
ServicesToRun = new ServiceBase[] 
    { 
     new MyService() 
    }; 

TextWriter tt2 = new StreamWriter(@"C:\startup.text", true); 
tt2.WriteLine("Run..."); 
tt2.Close(); 

它將「啓動服務」和「運行...」打印到日誌文件中。我也剝離了MyService的內部,因此它是空的。圍繞任何代碼都有一個try/catch,現在將其縮減爲上面的一些日誌行。我從來沒有輸入catch語句,它會記錄它。在OnStart中

一切已被註釋掉:

protected override void OnStart(string[] args) 
{ 
} 

所以我基本的想法。我以爲這個錯誤是因爲Start方法從未結束(或者不在30秒內)。有沒有其他方法被調用?任何想法都表示讚賞。

額外信息: MyService中的構造函數爲空。如果我插入一些Thread.Sleep(5000)行,那麼彈出關於錯誤1053的錯誤消息需要更長的時間。 Main方法似乎必須退出(沒有錯誤)。

+0

確保你捕獲所有未處理的異常並寫入米到你的日誌。例如:http://stackoverflow.com/questions/58280/unhandledexception-handler-in-a-net-windows-service ...這可能會給你更多的信息,爲什麼它失敗。 –

回答

15

你缺少ServiceBase.Run電話:

ServiceBase[] servicesToRun = new ServiceBase[] 
           { 
            new MyService() 
           }; 
ServiceBase.Run(servicesToRun); 

它也可能是一個好主意,訂閱未處理的異常通知:

static void Main() { 
    ... 
    AppDomain.CurrentDomain.UnhandledException 
             += CurrentDomain_UnhandledException; 
    ... 
} 

private static void CurrentDomain_UnhandledException(
               Object sender, 
               UnhandledExceptionEventArgs e) { 

    if (e != null && e.ExceptionObject != null) { 
     // log exception: 
    } 
} 

並添加以下try/catch來的OnStart因爲.NET/SCM吞下例外:

protected override void OnStart(String[] args) { 
    try { 

    } catch(Exception e) { 
     // log exception: 
     throw; 
    } 
} 
+1

另外,如果您想調試服務初始化,您可以在初始化代碼中調用System.Diagnostics.Debugger.Break()。當到達此行時,Windows會詢問您是否要啓動調試器,這將使您能夠從該點調試服務。 – Polyfun

+1

謝謝。 ServiceBase.Run(servicesToRun);該流程在該流程中已被註釋掉。 –

+1

對我來說,這是調試條件設置爲不調用'ServiceBase.Run(serviceToRun)運行;很多答案之後' – absynce

相關問題