Приложение Windows Mobile неожиданно завершает работу - PullRequest
2 голосов
/ 01 февраля 2012

У меня довольно сложное приложение на 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.

Любая помощь или предложения будут оценены, поскольку у меня нет идей и вещей, которые нужно проверить.

1 Ответ

0 голосов
/ 01 февраля 2012

Что ж, рискуя заявить очевидное, что-то может привести к сбою в работе вашего приложения, которое не позволяет запустить закрывающее событие.

Для ваших элементов, которые работают в отдельных потоках (вероятнее всего, подозрительно), вы можете создатьконтейнеры класса для них, которые реализуют 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 был доступен для этого класса.

Ошибки в потоках трудно обнаружить.

...