2011-08-05 29 views
3

我有一個WPF應用程序。 我已經實現了以下功能,但沒有人捕獲所有類型的應用程序出口。如何捕捉任何類型的應用程序退出?

public partial class App : Application 
{ 
    protected override void OnExit(ExitEventArgs e) 
    {} 

    private void Application_Exit(object sender, ExitEventArgs e) 
    {} 

    private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
    {} 

    private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e) 
    {} 
} 
  • 是否有處理應用程序退出一個通用的方法是什麼?

例如,當應用程序被強制關閉(殺死)時,上述方法都不會觸發。 每當應用程序關閉時,我需要解鎖數據庫中的一些對象,這些對象在應用程序運行期間由用戶鎖定。

+0

第一2應與(相同)。而第三個是錯誤退出, –

+0

@亨克Exakt,我需要一個通用的。 –

+0

你的意思是'OnExit '? –

回答

4

可以,除非你正在運行一個觀察者,從應用程序中單獨被調查(以下簡稱「目標」應用程序)不所有類型的存在。

的原因是,你不能抓內部應用程序崩潰(廢話),強制進程終止(內部和外部)或其他類似的效果。

你做什麼是非常好的。

如果您希望實施單獨的觀察器應用程序,則可以使用.NET Process.Exited事件,該事件在任何原因(包括應用程序崩潰)導致進程存在時觸發。

此外,正如@Christian指出的那樣,您應該不會嘗試有一個全面的解決方案,尤其是在處理關鍵應用程序崩潰時(這一點是主觀的)。 「當你以某種方式管理[從未處理的應用程序錯誤中恢復],你通常會做錯事,或至少(試圖爲P時,/從你自己的進程調用一個小型轉儲創建例如)可能會得到不準確的結果。」

+0

我已經實現了Process.GetCurrentProcess()。退出但沒有觸發。我在公共部分類App:Application的構造函數中實現了它。 –

+1

+1:我甚至會將它擴展爲「你*不能*和*不應該*」。因爲即使你以某種方式管理,你通常會做錯某些事情,或者至少可能得到不準確的結果(例如,當試圖從你自己的進程中創建P/Invoke一個小型轉儲創建時)。 –

+1

@Amir Rezaei:應該怎麼做?當* current *進程退出時,它不能向自己報告。 –

0

您可以將處理器的AppDomain.ProcessExit事件;據我所知,這是最可靠的方式來告訴你的應用程序何時退出。

如果你移動你的應用程序的Silverlight,但只要你保持內WPF(或任何其他「全尺寸」 .NET架構的應用程序)這應該做的伎倆這將不可用。

+0

當我通過Visual Studio停止按鈕關閉應用程序時,它沒有觸發。 –