0

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

应用程序维护一个日志文件,该文件记录所有已处理的异常以及在 Main 方法中在应用程序的全局范围内注册的未处理的全局异常。

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

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

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

提前感谢您的帮助。

副部

4

4 回答 4

2

可能有很多原因。根据我的经验,我认为正在发生一些无限循环或对某些锁定资源的调用。在这种情况下,请尝试使用 CLR Profiler for .NET CF。CLR Profiler 可以告诉你哪里出了问题。您可以从这里获得它:http: //www.microsoft.com/en-us/download/details.aspx?id= 13442 关于如何使用它,有一系列博客文章,请访问:http:// blogs.msdn.com/b/stevenpr/archive/2008/05/08/the-clr-profiler-for-the-net-compact-framework-series-index.aspx

我希望它有所帮助。

于 2012-09-12T16:59:54.527 回答
0

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

我相信如果你有一个前台线程(Thread.IsBackground = false),这将阻止进程终止,直到它结束 - http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground .aspx

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

我希望这会有所帮助。

于 2012-09-14T06:05:36.107 回答
0

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

在 ES400 上,我不记得是否有控制面板小程序来配置错误报告功能,但请检查那里。

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

有关该主题的一般信息,请参见此处:

http://msdn.microsoft.com/en-us/library/ee481217(v=winembedded.60).aspx

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

http://msdn.microsoft.com/en-us/library/ee480226(v=winembedded.60).aspx

于 2012-09-17T12:48:03.363 回答
0

如果您只是想捕获并记录此错误,请在程序的main函数中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.
    }
  }
}
于 2012-09-17T16:38:25.627 回答