簡體   English   中英

關閉Windows服務中的長時間運行的進程

[英]Shutting down a Long-running process in a Windows Service

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

在過程中途服務器關閉的情況下,我還沒有實現任何處理方法。 這可能會引起一些問題。 處理此問題的最佳做法是什么?

由於我不知道您實際上正在執行什么任務,因此只能給出模糊的建議。

如果要使用數據庫執行某些操作,那么如果未提交,則可以回滾事務。

如果涉及到一些文件處理,也許看看這個文章在事務性NTFS。 您可以結合使用它與TransactionScope對象來確保原子事務。

如果您正在處理Web服務,那么服務邊界將決定一項事務開始/結束的時間,而另一項事務開始的時間,使用補償模型(如果您破壞了一部分,則需要在恢復之后提供一種方法) ,一種在另一端通知/執行補償腳本的方式(考慮在線訂購圖書以及如何處理延期交貨,取消訂單等)

對於跟蹤機制,如果發生諸如關機之類的日志,請記錄每個步驟和時間表以進行故障排除。

如果您實質上描述了一個批處理過程,則可以有一個間隔運行的計時器是可以的-世界上很多地方都是這樣工作的。

如果它長期運行,請嘗試將工作單元或批次保持足夠小,以使您的過程至少可以檢查以查看是否已發出停止信號。 這將允許服務正常退出,而不是實質上忽略服務停止消息。

在您的計時器函數中的某處,您具有一個屬性IsShutdownRequired或諸如此類的屬性(可以進行一些循環處理)進行檢查。 該屬性在服務停止控制消息中設置為true,它使您的進程可以通過不嘗試做更多的工作來正常退出,或者按照吉米的建議,在事務中回退該工作。

理想情況下,小批量將比大批量更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM