我有一个相当复杂的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.Run
或UnhandledException
处理程序周围的异常处理程序中记录任何异常。我认为它可能与运行低/内存不足有关,这也是我将Hibernate
事件连接起来的原因。但我也没有得到Hibernate事件。
任何帮助或建议都会受到赞赏,因为我没有想法和要检查的事情。
答案 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
。
线程中的错误很难捕获。