2011-03-14 187 views
6

崩潰恢復構建到我的應用程序中的最佳方式(標準解決方案)可以在任何類型的崩潰時自動重新啓動。應用程序中的崩潰恢復

tnx。

+0

你的應用程序中是否有任何狀態? – 2011-03-14 18:14:54

+0

對不起,「狀態」? – MBZ 2011-03-14 18:26:41

+0

狀態,如當前視圖,未保存的更改,導航歷史記錄,有關應用程序「所在」的內容以及用戶創建的內容。 – 2011-03-14 18:41:18

回答

6

您在這裏有幾個選項。

第一個(也是最好的)是添加某種類型的全局錯誤處理,它將捕獲任何未捕獲的異常並正確處理它們。沿着這些路線,您應該開始在您的代碼庫中添加適當的特定異常處理。請記住,無論如何,堆棧溢出和某些安全和內存異常將超過任何全局處理。

第二個選擇是有一個監視服務,它只是測試,看看當前的應用程序是否仍在工作。如果不是,那麼強制殺死現有應用程序並重新啓動一個新實例。

第三個選項是將您的應用程序分成兩個應用程序。簡單地執行其他進程的外部「容器」類型應用程序。容器應用程序不會有UI,但會啓動主流程並觀察它(很像上面的選項2)。我見過這種應用在各種「模塊化」應用中。

問題是,唯一真正的方法是有2個應用程序:一個用於監視,另一個用於實際執行用戶界面和其他所有操作。

+4

全局錯誤'處理程序'無法處理很多錯誤,因爲它很少有足夠的上下文來知道是否可以繼續安全(即應用程序狀態是否仍然有效。 )爲了處理真正的崩潰(在適當的層面上無法處理或未處理的異常),我投票選擇了主流程解決方案,該解決方案在主流程中啓動和停止。在.NET中,這通常可以通過爲託管應用程序使用單獨的AppDomain來完成,而不需要完全獨立的進程。 – 2011-03-14 18:57:03

0

將持久狀態置於支持事務的東西中。例如。數據庫(sqlite)或者如果需求不太複雜,在寫入時使用copy(寫入更改爲新文件,並且只有在成功丟棄舊文件的情況下)。

這些建議非常通用。

10

一般來說最好不要這樣做,對於一個不斷啓動的進程沒有什麼特別的地方,而且用戶無助地看着這個大屠殺,會立即崩潰。但我只能把你的子彈給你,瞄準你的腳的槍是由你決定的。你需要這樣的代碼:

static void Main(string[] args) { 
     AppDomain.CurrentDomain.UnhandledException += ReportAndRestart; 
     // etc.. 
    } 

    static void ReportAndRestart(object sender, UnhandledExceptionEventArgs e) { 
     string info = e.ExceptionObject.ToString(); 
     // Log or display info 
     //... 
     // Let the user know you're restarting 
     //... 
     // And restart: 
     System.Diagnostics.Process.Start(
      System.Reflection.Assembly.GetEntryAssembly().Location, 
      string.Join(" ", Environment.GetCommandLineArgs())); 
     Environment.Exit(1); 
    } 
} 

請注意,我在命令行參數上使用了一個快捷方式。如果它們包含包含空格的文件的路徑,則應該引用它們。不要在你應該在省略號中輸入代碼的捷徑。

+0

Windows Services使用的不斷重新啓動的崩潰過程的一種解決方案是限制嘗試重新啓動過程的次數。當你有一個外部的'託管'進程監視啓動的應用程序,並因此可以維護關於其崩潰的狀態時,這最有效。與基於UI的應用程序相比,這對服務更好,但至少在服務方面,崩潰和重新啓動對用戶來說基本上是透明的。 – 2011-03-14 18:50:13

+0

如何恢復應用程序的狀態?每個單位都可以擁有對延續申請至關重要的狀態。 – Arijoon 2017-09-07 16:14:05