我目前正在开发一个处理数据库中数据的 WPF 应用程序,当我使用大约 1000 行的测试数据库对其进行测试时,它工作得很好,但现在我想处理大约 50 000 行,它在处理过程中崩溃了给我“‘应用程序’遇到问题,需要关闭...是否要将错误报告发送给 Microsoft...”。
现在这可能看起来像是其他几个问题的重复,但我已经尝试过 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());
}
}
处理由命令启动(带有命令绑定(bind)的 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 的 VM 上运行该应用程序(并且我已经等待了 2 个月才让我的 IT 部门安装 sql server,以便我可以在我的计算机上运行我的应用程序)。
如有任何帮助,我们将不胜感激!
最佳答案
您的 DoProcess 函数位于后台线程中。另一个线程可能正在崩溃,或者您可能在从后台线程调用 MessageBox 时遇到问题,因为它不是 UI 线程 - 因此您可能会遇到异常,然后由于 MessageBox 调用而从您的 catch 中抛出一个新异常。尝试在 MessageBox 调用之前插入代码将消息写入文件,看看是否有效,甚至是 Console.Beep() 并监听它:-) 如果这没有发现任何问题,请尝试将日志语句添加到文件中代码中的许多地方,直到缩小崩溃发生的位置为止。
关于c# - WPF应用程序遇到问题需要关闭,如何获得好的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6683846/