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イベントを取得しません。
私はアイデアやチェックするものがないので、何か助けや提案をいただければ幸いです。
こんにちはjp2code、私はあなたの提案に従うかわからない。とにかく、別のスレッドの主な機能には 'try/catch'ブロックがあり、そこから何も取得されません。また、例外はメインスレッドまでマーシャルされず、そこに捕まえられるか、 '' UnhandledException'ハンドラに捕捉されますか? – Djdewet
ちょっとDJ。私は使い捨てクラスを作成する少しのコード例を追加しました。この例では、 'Method1()'はスレッドに使用するものであれば何でも構いません。それが完了し、クラスが破壊されると、 '_logger'関数が呼び出されます。 – jp2code