2

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

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事件。因为我的想法和需要检查的事项

任何帮助或建议,将不胜感激。

回答

0

嗯,说明明显,一些风险崩溃的应用程序,是防止你的Closing事件烧制而成。

对于您的项目是在单独的线程(最有可能的嫌疑人)运行,您可以创建实现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可以为此类访问。

错误的线程可以是很难赶上。

+0

嗨jp2code,不知道我按照你的建议。无论如何,所有在独立线程上的主要函数都有'try/catch'块,我没有从那里记录任何东西。另外,这个异常不会汇集到主线程中,然后在那里或'UnhandledException'处理程序中被捕获? – Djdewet 2012-02-02 09:00:36

+0

嘿DJ。我添加了一个创建一次性类的代码示例。在这个例子中,'Method1()'是你用来处理的任何东西。当它完成并且你的类被销毁时,你的'_logger'函数将被调用。 – jp2code 2012-02-02 15:11:57