Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF应用程序遇到问题,需要关闭,如何获得好消息?_C#_Wpf_Crash - Fatal编程技术网

C# WPF应用程序遇到问题,需要关闭,如何获得好消息?

C# WPF应用程序遇到问题,需要关闭,如何获得好消息?,c#,wpf,crash,C#,Wpf,Crash,我目前正在开发一个WPF应用程序,它可以处理数据库中的数据,当我使用大约1000行的测试数据库测试它时,它工作得很好,但现在我想处理大约50000行,它只是在处理过程中崩溃了“‘应用程序’遇到问题,需要关闭。。。是否要将错误报告发送到Microsoft 现在,这看起来像是几个其他问题的重复,但我尝试了AppDomain.CurrentDomain.UnhandledException、AppDomain.CurrentDomain.ProcessExit、Application.Dispatch

我目前正在开发一个WPF应用程序,它可以处理数据库中的数据,当我使用大约1000行的测试数据库测试它时,它工作得很好,但现在我想处理大约50000行,它只是在处理过程中崩溃了“‘应用程序’遇到问题,需要关闭。。。是否要将错误报告发送到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());
  }
}
处理由命令启动(GUI按钮,带有命令绑定以调用此命令):

我在执行过程中检查了内存使用情况,它从来没有超过70兆,所以这不应该是一个问题。我使用了两个COM组件,一个是.exe,另一个是.dll,我不知道问题是否来自于此。请注意,有时这些组件崩溃,发生时我确实会收到有用的错误消息。我使用NHibernate从数据库读/写

现在我完全不知道问题出在哪里(DoStuff()部分相当大),我不明白错误如何通过所有这些异常处理程序,并在没有信息的情况下使应用程序崩溃。请注意,我无法在Visual Studio中调试应用程序,因为我在未安装Visual Studio的VM上运行应用程序(我已经等了2个月,让我的IT部门安装我的sql server,这样我就可以在我的计算机上运行我的应用程序了)



非常感谢您的帮助!

您确实需要设置Visual Studio和调试器。没有它,您将在黑暗中进行探测。

您确实需要设置Visual Studio和调试器。没有它,您将在黑暗中进行探测。

您的DoProcess函数位于后台线程中。另一个线程可能正在崩溃,或者从后台线程调用MessageBox可能会出现问题,因为它不是UI线程——因此您可能会收到一个异常,然后由于MessageBox调用而从捕获中抛出一个新异常。请尝试在MessageBox调用之前插入代码将消息写入一个文件,看看是否有效,甚至是控制台。Beep()对于这件事,请倾听:-)如果没有发现任何问题,请尝试将日志语句添加到代码中多个位置的文件中,直到缩小崩溃发生的范围。

您的DoProcess函数位于后台线程中。另一个线程可能正在崩溃,或者您可能在从后台线程调用MessageBox时遇到问题,因为它不是UI线程,因此您可能会遇到问题正在清除一个异常,然后由于MessageBox调用而从捕获中抛出一个新的异常。请尝试在MessageBox调用之前插入代码将消息写入一个文件,然后查看该操作是否有效,甚至是控制台。Beep()对于这一点,请仔细听:-)如果没有发现任何问题,请尝试在代码中的许多位置向文件中添加日志语句,直到您缩小崩溃发生的范围。

是的,这是最好的选择,但我想知道是否有方法捕获代码中的错误?在Visual Studio中,您可以让调试器在出现错误的那一行中断异常被抛出,而不是它所在的位置caught@Carl,也许你可以让他们用Visual Studio为你构建一个虚拟机?@Scott,相信我,如果我可以做一些事情,而不需要向我们的IT部门询问任何事情,那么这样做会花费更少的时间。是的,这是最好的选择,但我想知道是否有一种方法可以捕获代码中的错误?在Visual Stu中dio您可以让调试器在引发异常的行中断,而不是在异常所在的行中断caught@Carl,也许你可以让他们用Visual Studio为你构建一个虚拟机?@Scott,相信我,如果我可以做一些事情而不需要向我们的IT部门提出任何要求,那么这样做会花费更少的时间。它不起作用。我只是试着编写文件。创建(“C:\\dumpFile.txt“)而不是MessageBox.Show,但仍然没有创建文件,我仍然遇到了应用程序崩溃。这可能意味着另一个线程正在崩溃,这就是为什么你的捕获无法工作。向你的应用程序添加日志代码以缩小崩溃的范围。是的,我想我会使用日志方法,但是否可以设置事件处理程序或其他方法ise是否在另一个线程上捕获错误?请注意,我的DoStuff方法不会创建任何其他线程,至少在我编写的部分中是如此(我不知道NHibernate或.NET的COM包装器是否创建线程)。我不知道如何捕获线程中的所有错误。一个问题可能是您在COM中例外(非托管)在这种情况下,任何类型的C#catch都不会应用,您也会像现在这样崩溃。请检查您的COM调用。我的所有COM方法都包装在try/catch块中以避免出现故障,请注意,如果COM调用失败(即使COM进程完全崩溃并退出),我在C端遇到一个异常。这很可能是线程问题,但我认为这不是COM问题。它不起作用。我只是尝试编写File.Create(“C:\\dumpFile.txt”)而不是MessageBox.Show,但仍然没有创建文件,我仍然遇到了应用程序崩溃。这可能意味着另一个线程正在崩溃,这就是为什么你的捕获无法工作。向你的应用程序添加日志代码以缩小崩溃的范围。是的,我想我会使用日志方法,但是否可以设置事件处理程序或其他方法ise是否在另一个线程上捕获错误?请注意,我的DoStuff方法不会创建任何其他线程,至少在我编写的部分中是如此(我不知道NHibernate或.NET的COM包装器是否创建线程)。我不知道如何捕获线程中的所有错误。一个问题可能是您在COM中例外(非托管)在这种情况下,任何类型的C#catch都不会应用,你也会像你一样崩溃
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());
  }
}