2013年4月19日 星期五

[C#] Windows Service 啟動失敗

        最近在把Console的程式改寫成Windows Service,發現如果在ServiceBase的建構子如果有寫到需要等待的動作才能繼續往下執行程式碼的話。服務就會無法被啟動。

        舉個例子來說明,如果在建構子有以下程式
_TcpListener.AcceptTcpClient()

等待Client的連入,那就會造成服務無沒被啟動。

而解決的方式就是把同步改成非同步的方式來等待Client連入
_TcpListener.BeginAcceptSocket(new AsyncCallback(Accept_Completed), _TcpListener);


後來,我在建構子寫一個空的while(true){}的迴圈來做測試,服務一樣也無法被啟動。

像這種情況下,下指令移除服務,服務是沒有辦法被移除乾淨的。必需要重開機或者登出再登入服務才會真正被移除。



5/6補充:
    在建構子寫AcceptTcpClient()本身就是一個不好的寫法。其實在繼承ServiceBase的類別中去覆寫OnStart(string[] args)的方法,再把原本寫在建構子的程式碼搬到覆寫的方法中就可以了。這個方法會在Service啟動時被呼叫,所以即使是寫_TcpListener.AcceptTcpClient()也不會有任何問題喔!

沒有留言:

張貼留言