【问题标题】:Windows Mobile Application exiting unexpectedlyWindows Mobile 应用程序意外退出
【发布时间】:2012-02-23 23:47:30
【问题描述】:

我有一个在 Windows Mobile 5.0 及更高版本上运行的相当复杂的 c# 应用程序。它包括使用 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 事件。

任何帮助或建议将不胜感激,因为我没有想法和要检查的东西。

【问题讨论】:

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


    【解决方案1】:

    好吧,冒着明显的风险,您的应用程序正在崩溃,从而阻止您的 Closing Event 触发。

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

    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

    线程中的错误很难捕捉。

    【讨论】:

    • 您好 jp2code,不确定我是否遵循您的建议。无论如何,单独线程上的所有主要功能都有try/catch 块围绕它们,我没有从那里得到任何记录。此外,异常不会编组到主线程然后被捕获到那里或在 'UnhandledException 处理程序中?
    • 嗨 DJ。我添加了一个创建一次性类的小代码示例。在示例中,Method1() 将是您用于线程的任何内容。当它完成并且你的类被销毁时,你的 _logger 函数将被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多