2011-07-13 55 views
1

我目前正在處理一個處理數據庫中的數據的WPF應用程序,當我用1000行左右的測試數據庫測試它時,它工作正常,但現在我要處理大約50000行,並且在處理過程中只是崩潰我「」應用程序「遇到了問題,需要關閉......您是否想向微軟發送錯誤報告......」。WPF應用程序遇到問題,需要關閉,如何獲得好消息?

現在這可能看起來像是其他一些問題的重複,但我已經嘗試了AppDomain.CurrentDomain.UnhandledException,AppDomain.CurrentDomain.ProcessExit,Application.DispatcherUnhandledException,它只是崩潰而沒有消息。

這裏是什麼樣子:

private void OnStartup(object sender, StartupEventArgs e) 
{ 
    AppDomain.CurrentDomain.UnhandledException += (s, args) => 
    { 
    MessageBox.Show("Message1"); 
    }; 

    AppDomain.CurrentDomain.ProcessExit += (s, args) => 
    { 
    MessageBox.Show("Message2"); 
    }; 

    this.DispatcherUnhandledException += (s, args) => 
    { 
    MessageBox.Show("Message3"); 
    }; 

    try 
    { 
    Views.MainView view = new Views.MainView(); 
    view.DataContext = new ViewModels.MainViewModel(); 
    view.ShowDialog(); 
    } 
    catch (Exception exception) 
    { 
    MessageBox.Show(exception.ToString()); 
    } 
} 

的處理都可以通過命令啓動(使用命令綁定一個GUI按鈕來調用這個):

public void Process() 
{ 
    Thread workerThread = new Thread(new ThreadStart(DoProcess)); 
    workerThread.IsBackground = true; 
    workerThread.Start(); 
} 

private void DoProcess() 
{ 
    try 
    { 
    // Most probably crashes during that 
    DoStuff(); 
    } 
    catch (Exception e) 
    { 
    System.Windows.MessageBox.Show(e.ToString()); 
    } 
} 

我執行期間檢查內存使用情況它永遠不會超過70兆,所以這應該不成問題。我使用2個COM組件,一個是.exe,另一個是.dll,我不知道是否會有問題。請注意,有時這些組件會崩潰,而且當它發生時我會收到一條有用的錯誤消息。我使用NHibernate從數據庫讀取/寫入數據。

現在我完全不知道問題是什麼(DoStuff()部分是相當大的),我不明白錯誤是如何通過所有這些異常處理程序,並只是在沒有信息的情況下使應用程序崩潰。請注意,我無法在Visual Studio中調試應用程序,因爲我在沒有安裝Visual Studio的虛擬機上運行應用程序(並且我一直在等待2個月讓我的IT部門安裝我的sql服務器,以便我可以在我的電腦上運行我的應用程序)。

任何幫助,將不勝感激!

回答

1

您的DoProcess函數位於後臺線程中。另一個線程可能會崩潰,或者您可能會遇到從後臺線程調用MessageBox的問題,因爲它不是UI線程 - 因此您可能會收到異常,然後由於MessageBox調用而從catch中拋出新異常。嘗試在MessageBox調用之前插入代碼以將消息寫入文件,並查看是否可行,或者甚至是Console.Beep(),並監聽它:-)如果沒有發現任何內容,請嘗試將日誌語句添加到文件中直到您縮小發生崩潰的位置時,您的代碼中有許多地方。

+0

我會盡力答覆 – Carl

+0

這沒有奏效。我只是嘗試編寫File.Create(「C:\\ dumpFile.txt」)而不是MessageBox.Show,但該文件仍未創建,並且仍然遇到應用程序崩潰。 – Carl

+0

這可能意味着另一個線程崩潰,這就是爲什麼你的catch不起作用。將日誌記錄代碼添加到您的應用,以縮小崩潰的位置。 –

0

你真的需要得到Visual Studio和調試器的設置。沒有它,你會在黑暗中探索。

+0

是的,這是最好的選擇,但我想知道是否有一種方法來捕捉代碼中的錯誤? – Carl

+0

在Visual Studio中,您可以讓調試器在拋出異常的位置中斷,而不是捕獲到異常的位置 – aqwert

+0

@Carl,也許您可​​以讓他們使用Visual Studio爲您構建VM? –

相關問題