Windows服務編寫原理及探討(4)

來源:互聯網
上載者:User

(四)一些問題的討論

前面幾章的內容都是服務的一些通用的編寫原理,但裡面隱含著一些問題,編寫簡單的服務時看不出來,但遇到複雜的應用就會出現一些問題,所以本章就是用來分析、解決這些問題的,適用於進階應用程式的開發人員。我這一章的內容都是經過實驗得到的,很有實際意義。

我在第一章裡面就說過,是由一個服務的主線程執行CtrlHandler函數,它將收到各種控制命令,但是真正處理命令,執行操作的是ServiceMain的線程。現在,當一個SERVICE_CONTROL_STOP到達之後,你作為一個開發人員,要怎樣停止這個服務?在我看過的一些原始碼裡,大部分只是簡單的調用TerminateThread函數去強行殺掉服務進程。但應該稍稍有點線程編程的常識就應該知道TerminateThread函數是可用的調用中最為糟糕的一個,服務線程將得不到任何機會去做應該的清理工作,諸如清除記憶體、釋放核心對象,Dlls也得不到任何線程已經被毀的通知。

所以停止服務的適當方法是以某種方式啟用服務線程,讓它停止繼續提供服務功能,然後執行完當前操作和清除工作後返回。這就表示你必須在CtrlHandler線程和ServiceMain線程之間執行適當的線程通訊。現在已知的最好的內部線程通訊機制是I/O Completion Port(I/O 完成連接埠),假如你編寫的是一個大型的服務,需要同時處理為數眾多的請求,並且運行在多處理器系統上面,這個模型就可以提供最佳的系統效能。但也正因為它的複雜性較高,在小規模的應用上面不值得花費很多的時間和精力,這時作為開發人員可以適當的選取其它的通訊方式,諸如非同步程序呼叫隊列、通訊端和視窗訊息,以適應實際情況。

開發服務時的另外一個重要問題就是調用SetServiceStatus函數時的所有狀態報表問題。很多的服務開發人員為了在什麼時候調用SetServiceStatus的問題而常常產生爭論,一般推薦的方法就是:先調用SetServiceStatus函數,報告SERVICE_STOP_PENDING狀態,然後將控制碼傳給服務線程或者再建立一個新的線程,讓它去繼續執行操作,當該線程即將執行完操作之前,再由它將服務的狀態設定成SERVICE_STOPPED,然後服務正好停止。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.