2011-07-13 50 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? –

相关问题