C# Windows Mobile上的.NET CF应用程序冻结,全局异常处理程序中没有详细信息

C# Windows Mobile上的.NET CF应用程序冻结,全局异常处理程序中没有详细信息,c#,.net,winforms,windows-mobile,compact-framework,C#,.net,Winforms,Windows Mobile,Compact Framework,我正在为windows移动设备——摩托罗拉ES400开发一个.net cf应用程序 应用程序维护一个日志文件,该文件记录所有已处理的异常和未处理的全局异常,这些异常在主方法的应用程序全局范围内注册 出于某种原因,当我在手机上运行应用程序时,应用程序只是冻结了——这意味着我无法单击应用程序上的任何按钮或使用手写笔执行任何其他操作。申请完全没有反应。当我回到手机的Windows Mobile OS开始菜单->任务管理器并试图关闭应用程序时,我无法关闭。任务管理器不会关闭应用程序。当我检查日志时,我看

我正在为windows移动设备——摩托罗拉ES400开发一个.net cf应用程序

应用程序维护一个日志文件,该文件记录所有已处理的异常和未处理的全局异常,这些异常在主方法的应用程序全局范围内注册

出于某种原因,当我在手机上运行应用程序时,应用程序只是冻结了——这意味着我无法单击应用程序上的任何按钮或使用手写笔执行任何其他操作。申请完全没有反应。当我回到手机的Windows Mobile OS开始菜单->任务管理器并试图关闭应用程序时,我无法关闭。任务管理器不会关闭应用程序。当我检查日志时,我看不到通过registeres unhandled global exception例程记录的任何未处理异常

我不明白这里可能有什么问题

根据您使用.NET CF的经验,有人知道可能会发生什么吗?在哪里我可以开始寻找或分析

提前感谢您的帮助


Subbu

原因可能有很多。根据我的经验,我假设有一些无限循环或对某个锁定资源的调用正在发生。在这种情况下,请尝试使用.NET CF的CLR事件探查器。CLR事件探查器可以向您显示哪里出了问题以及哪里出了问题。 您可以从这里获得: 关于如何使用它,有一系列博客文章,请访问:


我希望这会有帮助。

不久前我遇到过一些类似的问题。我使用的是一个条形码扫描仪驱动程序,它创建了一个单独的线程并循环,直到条形码被扫描。当我试图退出应用程序时,它会等待线程停止,导致应用程序冻结,直到扫描条形码。任务管理器也无法结束应用程序

我相信如果您有一个前台线程(thread.IsBackground=false),这将阻止进程终止,直到它结束-

因此,您的问题可能来自已启动的辅助线程。如果您正在等待一个线程,通过锁或类似的东西,并且该线程处于无限循环中,那么这可能是问题的原因。我产生连续无限循环的最常见原因是有一个属性getter引用属性而不是支持变量

我希望这能有所帮助。

如果您遇到硬故障(操作系统级错误,如memeory访问冲突),那么我看到系统在创建Dr Watson日志时冻结

在ES400上,我不记得是否有控制面板小程序混淆错误报告功能,但请检查

如果它是在创建这样一个日志,那么默认情况下,我认为它位于\windows下的子文件夹中。但是整个过程如果可以通过注册表进行配置,那么您可能需要在那里查看

请参见此处了解一般主题:

这里专门针对注册表设置:


如果您只是想捕获并记录此错误,请在程序的主功能中的代码周围放置一个
try…catch

在C#中,这将只是从以下内容编辑
Program.cs

static void Main() {
  Application.Run(new Form1());
}
private static Form1 m_form;

static void Main() {
  try {
    m_form = new Form1();
    Application.Run(m_form);
  } catch (Exception err) {
    // log error
    if ((m_form != null) && !m_form.IsDisposed) {
      // you might want to save data on your form before it goes Bye-Bye.
    }
  }
}
对这样的事情:

static void Main() {
  Application.Run(new Form1());
}
private static Form1 m_form;

static void Main() {
  try {
    m_form = new Form1();
    Application.Run(m_form);
  } catch (Exception err) {
    // log error
    if ((m_form != null) && !m_form.IsDisposed) {
      // you might want to save data on your form before it goes Bye-Bye.
    }
  }
}

这是我们使用的方法。将日志或事件写入数据库通常证明问题太大。至少,如果在源代码处捕获并显示异常,用户可以告诉支持人员一条消息。感谢您的回复。我已经为应用程序中使用的每个线程实现了这个方法,因为这种方法保证在主线程关闭时关闭线程。@Subbu:你应该给每个花时间给你答案的人一个a(+1)…除非他们告诉你做错事!