2

Windows Mobile 5.0以降で動作するかなり複雑なC#アプリケーションがあります。これには、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.RunまたはUnhandledExceptionハンドラの周りの例外ハンドラからログに記録された例外もありません。私はそれが低/メモリ不足に関連する可能性があると思ったので、私はHibernateイベントを有線接続しています。しかし、私はHibernateイベントを取得しません。

私はアイデアやチェックするものがないので、何か助けや提案をいただければ幸いです。

答えて

0

明らかに明白になる危険がありますが、何かがあなたの閉会イベントが発砲するのを妨げているあなたのアプリをクラッシュさせています。

別のスレッド(おそらく容疑者)で動作するアイテムについては、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しかし、このクラスにアクセスできるような方法を作成する必要があります。

スレッド内のバグは、キャッチするのが難しい場合があります。

+0

こんにちはjp2code、私はあなたの提案に従うかわからない。とにかく、別のスレッドの主な機能には 'try/catch'ブロックがあり、そこから何も取得されません。また、例外はメインスレッドまでマーシャルされず、そこに捕まえられるか、 '' UnhandledException'ハンドラに捕捉されますか? – Djdewet

+0

ちょっとDJ。私は使い捨てクラスを作成する少しのコード例を追加しました。この例では、 'Method1()'はスレッドに使用するものであれば何でも構いません。それが完了し、クラスが破壊されると、 '_logger'関数が呼び出されます。 – jp2code

関連する問題