2011-06-24 102 views
2

我有一個要求,即運行在用戶空間(不是服務)中的Windows Forms C#.NET 2.0程序程序必須始終運行。由於我沒有犯錯,並且犯了編碼錯誤,我想知道任何額外的保護措施,我可以用來確保滿足這個要求。我一直在想的事情是TaskScheduler每5分鐘檢查一次,一個存根監視器或一個輔助進程。這些好/壞主意?始終運行的Windows程序

感謝, 理查德

編輯:(!明顯的和明智的回答)我沒有使用服務的原因是該程序在亭式環境中運行,並具有有一個沉重的GUI組件。該服務選項在Windows 2000 - W7中無法正常工作。

編輯:不使用服務的第二個原因是應用程序需要互聯網訪問,在我們的一些客戶網站上,代理設置爲只允許特定用戶(不是本地系統帳戶),所以這將是棘手的如果有多個用戶登錄到計算機,請確保訪問。

+6

安裝包你似乎在說我怎麼創造的東西,就像一個窗口服務,但不是一個窗口服務。你能解釋一下爲什麼你不想要一個windows服務,所以我們可以更好地理解你正在努力實現的目標。 –

+0

Windows服務有什麼問題?他們的設計是爲了完成你想要的。 –

+0

確切地說,如果你需要一些GUI服務的GUI組件,然後創建一個,用戶可以選擇打開它並調整設置和東西 –

回答

4

有,你可以採取三種方法:

  1. 心跳消息。

    心跳在分佈式應用程序中很有用,它只是發送的消息(從讓客戶端到服務器)發送,以確認它仍然正常運行。

  2. Manager過程

    存根程序,無論是作爲用戶處理或服務中實現。它啓動主應用程序,監視所有未處理的異常,報告錯誤並在失敗時重新啓動。

  3. 入口點的異常警衛。

    應用程序入口點的try-catch-all。

我會推薦前兩個選項之一;第三個選項,try-catch-all,對懶惰和沒有經驗的程序員(恕我直言)是一個特別討厭的破解。

我已成功在大型分佈式應用程序中使用心跳和管理器進程。

UPDATE

至於現成的去™重啓管理器,如靈光Istace博客文章(http://istacee.wordpress.com/2013/09/21/automatic-recovery-restart-in-net-application/)討論了Windows的API Codepack看一看。

您可以從https://www.nuget.org/packages/WindowsAPICodePack-Core/

+0

非常感謝你的回答 - 很高興聽到一些真實世界的經驗。 –

+0

不客氣理查德。我剛剛閱讀了更新後的問題,並提供了有關信息亭的更多建議/經驗。我肯定會推薦以用戶流程實現的管理方法,因爲當您需要部署到客戶端時,它會給您帶來更少的困難。另外(這只是一個想法),您可能希望每天早上在開放時間(假設它用於一般公衆使用)之前安排新的應用程序啓動,因爲您可以保證它從前一天沒有進入某個已知狀態,該應用程序不會癱瘓。 – Dennis

+0

是否有任何預製管理程序? – Petah

5

任務調度程序是這個工作的便宜的解決方案。我使用它來保持我們的Perforce代理服務器正常運行(服務中存在一些問題),到目前爲止沒有任何問題 - 儘管我已經說過服務器可能爆炸了!

但是,最完整的解決方案是調用您的應用程序的Windows服務。您可以從應用程序獲取該服務捕獲錯誤返回代碼,在失敗時重新啓動它並通過電子郵件通知您,這可能有助於您診斷和解決這些問題。我認爲任務計劃程序有類似的功能,但它不能像應用程序服務那樣提供對應用程序的深入瞭解。

如果你不確定如何做到這一點,那麼這樣的事情應該工作: http://www.codeproject.com/KB/install/csharpsvclesson1.aspx

+0

服務的想法是我考慮過的,但是對於權限來說它變得有點棘手。以本地系統帳戶運行的服務默認情況下不能啓動作爲代理設置所需的用戶運行的應用程序。 –

+0

確實如此,儘管您應該能夠將您的服務設置爲以用戶身份運行,所以它應該能夠以該用戶的身份啓動應用程序(甚至是GUI應用程序)。我已經看到這與我們的CC.NET服務,它作爲一個建立用戶運行。 – JohnL

+0

當然,但其他用戶登錄時會出現問題 - 通過代理訪問互聯網時,應用程序需要以登錄用戶身份運行。如果服務配置爲以一個用戶身份運行,則這變得非常棘手。 –