Windows Mobile应用程序意外退出

时间:2012-02-01 09:24:54

标签: c# multithreading windows-mobile microsoft-sync-framework

我有一个相当复杂的c#应用程序,它运行在Windows Mobile 5.0及更高版本上。它包括使用SQL CE的代码,在单独的线程上更新GPS坐标,还在单独的线程中使用Microsoft Sync Framework在后台同步到服务器。应用程序通常运行得相当好,但在生产中经常出现,应用程序主窗口消失 我在Program.cs文件中有类似以下的代码:

static class Program
{
    private static NLog.Logger _logger = NLog.LogManager.GetLogger("Program");
    [MTAThread]
    static void Main()
    {
        try
        {
            _logger.Info("Program V {0} starting.", Utility.AppVersion);
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
            Application.Run(new MainForm());
            _logger.Info("After Application.Run().");
        }
        catch (Exception ex)
        {
            _logger.ErrorException("Exception occurred.", ex);
        }
    }

    static void MobileDevice_Hibernate(object sender, EventArgs e)
    {
        _logger.Info("Hibernate was received.");
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        _logger.ErrorException("Unhandled exception was thrown", e.ExceptionObject as Exception);
    }
}

我按预期看到了启动信息日志,当应用程序消失时,我也收到After Application.Run()消息。但是我没有在MainForm.Closing事件中记录消息,因此它似乎永远不会被调用。我也没有从Application.RunUnhandledException处理程序周围的异常处理程序中记录任何异常。我认为它可能与运行低/内存不足有关,这也是我将Hibernate事件连接起来的原因。但我也没有得到Hibernate事件。

任何帮助或建议都会受到赞赏,因为我没有想法和要检查的事情。

1 个答案:

答案 0 :(得分:0)

好吧,冒着说明显而易见的风险,有些东西会让你的应用程序崩溃,导致你的关闭事件无法解雇。

对于在不同线程上运行的项目(很可能是嫌疑人),您是否可以为实现IDisposable的人创建类容器?然后,您可以在NLog方法中放置Dispose()引用来记录您的数据。

public class FirstClass : IDisposable {

  private bool isDisposed;

  public FirstClass() {
    isDisposed = false;
  }

  public void Dispose() {
    _logger.Info("FirstClass is done.");
    isDisposed = true;
  }

  public void Method1() {
    while (!isDisposed) {
      // your code here
    }
  }

}

但是,您需要创建一种方式,以便此类可以访问_logger

线程中的错误很难捕获。