2011-09-21 124 views
1

我有一個關於異常處理的問題。防止未處理的異常停止應用程序

爲了防止 「[YourProgram]已停止工作」 Windows對話框,通常我趕上甚至未處理的異常,這種方式:

在App.xaml.cs:

protected override void OnStartup(StartupEventArgs e) 
    { 
     Application.Current.DispatcherUnhandledException += ProcessDispatcherException; 
     AppDomain.CurrentDomain.UnhandledException += ProcessUnhandledException; 
     // Blah blah blah... Performs a lot of loading operations... 
     mainWindow.Show(); 
    } 

然後

private void ProcessUnhandledException(object o, UnhandledExceptionEventArgs e) 
    { 
     logException("An unhandled exception has been thrown\n"+(e.ExceptionObject as Exception).ToString(), e.ExceptionObject as Exception); 
     Application.Current.Shutdown(); 
    } 

好吧,我沒有Windows對話框。現在理想情況下,我想阻止這種強制關閉場景。我在這裏開發的應用程序的啓動時間對於最輕的用戶來說持續大約1分鐘(其中大多數用戶需要等待2到3分鐘才能啓動它,它必須加載非常大且複雜的數據參考),因此重新啓動它可能會造成麻煩

我想知道關於這種情況的「最佳做法」。我正在考慮在處理程序中重新創建一個新窗口,並重新顯示它,因此只有用戶界面將重新初始化爲啓動狀態,沒有其他參考將被加載,保存2-3分鐘。任何其他建議?

哦,當然,這是「不應該達到的極端緊急情況」,但不幸的是,這主要是由於我們依賴於其他公司管理的其他系統,而我沒有任何控制或有權投訴(是的,國際公司可以吸的某個時候),並且它不嘗試/開捕代碼:(

謝謝!

+1

你怎麼能確定只是創建一個新的窗口將工作?由於存在未處理的異常,您實際上並不知道程序其餘部分的狀態。這可能很好,也可能不會。只是在它上面打開一個新窗口就是在尋求麻煩。 – stijn

+0

你能展示一些try catch塊無法捕捉的代碼嗎?我想不出任何... –

+0

閱讀此: http://stackoverflow.com/questions/7152354/which-exceptions-shouldnt-i-catch/7152374#7152374 –

回答

3

我從你寫什麼假設你希望你的應用程序是關鍵任務,意思是說,如果發生任何事情使其失敗,就需要自動重啓。

完成此操作的最佳方法是創建第二個看門狗進程,該進程在失敗的任何時候都會重新啓動應用程序。然後,當有未處理的異常時,您可以允許您的應用程序悄悄終止自己,清理未經處理的異常處理器中的任何內容。

像這樣實現看門狗的最簡單方法是通過後臺線程循環來實現無窗口進程(例如控制檯應用程序),通過檢查等待句柄是否被鎖定來定期檢查應用程序是否正在運行。事情是這樣的:

// Declared in class 
object checkLocker = new object(); 
bool mtStopCheck = false; 

// Thread loop 
bool stopCheck = false; 
while (stopCheck == false) 
{ 
    if (wait_handle_is_unlocked) 
     restart_application(); 
    Thread.Sleep(1000); 

    lock (checkLocker) 
    { 
     stopCheck = mtStopCheck; 
    } 
} 

當你想關閉看門狗下另一個線程做到這一點:

// Stop the watchdog thread so the watchdog app can shut down 
lock (checkLocker) 
{ 
    mtStopCheck = true; 
} 

因爲你會在同一終端會話中運行你並不需要一個全球性的等待在Vista/Windows 7上處理沒有特權問題。

如果用戶關閉了應用程序,並且不希望它再次運行,則可以向看門狗進程發送信號(例如,使用命名管道或使用第二種類型的等待句柄,當您希望看門狗掛起時您鎖定掛起或關閉)該應用程序已關閉,不應重新啓動。

您可以在啓動文件夾或其他自動方法中啓動您的看門狗,也可以讓您的應用程序在第一次運行時啓動它。

+1

如果你需要更具體的信息讓我知道。您可能會發現這本書「Windows上的並行編程」(Addison Wellelsy,作者Joe Duffy)對於這樣的努力非常有價值。他解釋瞭如何使用所有的等待句柄和一些優秀的多線程信息。 –

相關問題