2009-06-05 107 views
2

當我關閉我的C#應用​​程序時,我得到一個窗口聲音,指出一個錯誤。然而,當我通過關閉過程進行調試時,我一路回到Program類...關閉C#錯誤

它通過Application.Run(..),退出靜態無效Main()函數,然後造成誤差噪音。

除了噪音以外,沒有任何指示有錯誤。我甚至不知道從哪裏開始尋找!有任何想法嗎?

+0

你的程序在做什麼類型的事情?例如,它是否開始新線程? – 2009-06-05 20:35:57

+0

我以爲我是在啓動線程,但即使沒有觸及那個代碼,錯誤也會發生。所以,線程不是一個因素。 – Matt 2009-06-05 20:43:02

+0

我認爲你應該發佈代碼,如果你在程序關閉時執行任何代碼。 另外,該程序如何關閉?通過使用關閉按鈕? – bobbyalex 2009-06-05 20:49:33

回答

0

清理過程中出現問題,可能很難找到。有兩種方法來攻擊它:

通過在try/catch中包裝Main中的所有內容並在Application.Run之後添加一些代碼,以增強在仍處於控制範圍內時(主要)檢測它的機會盡可能多地進行清理。我能想到的幾件事:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
Thread.Sleep(1000); 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

收集至少2次,也許更多。本着同樣的精神,在MainForm的OnClosing中添加一些Application.DoEvents()。

另一種方法更依賴於您的代碼,在黑暗中進行刺探:查找可設置爲null的所有靜態字段/屬性以及可以在Exit上確定性地處置的Disposable對象。

所有這些與FredrikMörks對UnhandledException事件的建議相結合。

1

它只發生在關閉你的應用程序或關閉任何應用程序時發生?

我的第一個想法是,有人改變了你的Windows聲音模式,並設置關閉程序的聲音與你混亂:)。

3

你可能爲了獲取某些信息而需要做的一件事就是爲AppDomain.UnhandledException和Application.ThreadException事件掛接事件監聽器。這是一個長鏡頭,但可能會提供一些信息。您可以添加在主函數來設置他們之初以下,並將它們顯示在消息框中的任何異常信息:

static void Main() 
{ 
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(delegate(object sender, UnhandledExceptionEventArgs e) 
    { 
     MessageBox.Show(e.ExceptionObject.ToString()); 
    }); 
    Application.ThreadException += new ThreadExceptionEventHandler(delegate(object sender, ThreadExceptionEventArgs e) 
    { 
     MessageBox.Show(e.Exception.ToString()); 
    }); 

    // run your app 
} 
0

你是否有引發自定義事件的任何代碼?當應用程序試圖實時關閉時,這些進程仍可以運行嗎?

您是否有任何可以在關閉時運行的自定義Dispose代碼?