2009-07-15 69 views
1

我有一個執行長時間運行的進程的Windows服務。它由計時器觸發,整個過程可能需要幾分鐘才能完成。當計時器過期時,服務實例化執行各種任務的管理對象,記錄結果然後退出。關閉Windows服務中的長時間運行進程

我還沒有實現任何處理這些情況時,服務器在過程中關閉。這可能會導致一些問題。處理這個問題的最佳做法是什麼?

回答

0

只能給出模糊的建議,因爲我不知道你實際上在做什麼任務。

如果是w/database的事情,有事務可以回滾,如果它沒有提交。

如果涉及到一些文件操作,或許看看this關於Transactional NTFS的文章。您可以將它與W/TransactionScope對象結合使用以確保原子事務。

如果您正在處理Web服務,那麼服務邊界將決定何時一個事務開始/結束以及另一個事務開始時,使用補償模型(如果您打破了某個部分,則需要稍後提供一種方法(考慮在線訂購書籍以及如何處理缺貨,取消等)

對於追蹤機制,記錄每個步驟和時間表如果發生類似關機的故障,則排除故障

0

如果您基本上描述了一個批處理過程,那麼可以有一個定時器在一個間隔內工作 - 很多世界d以這種方式工作。

如果長時間運行,請儘量讓您的工作單元或批次足夠小,以至於您的過程至少可以檢查是否已通知其停止與否。這將允許服務優雅地退出,而不是基本上忽略服務停止消息。

在你的計時器函數的某個地方,你有一個屬性,IsShutdownRequired或者其他的,你的檢查(假設一些循環處理)。該屬性在服務停止控制消息中設置爲true,它允許您的流程通過不嘗試做更多工作或者如Jimmy所建議的那樣,在事務中回滾該工作時正常退出。

理想情況下,較小的批次會比一個大的更好。