舉個例子來說明,如果在建構子有以下程式
_TcpListener.AcceptTcpClient()
等待Client的連入,那就會造成服務無沒被啟動。
而解決的方式就是把同步改成非同步的方式來等待Client連入
_TcpListener.BeginAcceptSocket(new AsyncCallback(Accept_Completed), _TcpListener);
後來,我在建構子寫一個空的while(true){}的迴圈來做測試,服務一樣也無法被啟動。
像這種情況下,下指令移除服務,服務是沒有辦法被移除乾淨的。必需要重開機或者登出再登入服務才會真正被移除。
5/6補充:
在建構子寫AcceptTcpClient()本身就是一個不好的寫法。其實在繼承ServiceBase的類別中去覆寫OnStart(string[] args)的方法,再把原本寫在建構子的程式碼搬到覆寫的方法中就可以了。這個方法會在Service啟動時被呼叫,所以即使是寫_TcpListener.AcceptTcpClient()也不會有任何問題喔!
沒有留言:
張貼留言