「プログラムが動作していません」というダイアログを表示しないように、in this postを読んだところ、AppDomainから未処理の例外をキャッチする必要があります。未処理の例外をキャッチしても「プログラムが動作していません」ダイアログが表示される
public Form1()
{
///Code
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
///more code
}
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
var excep = e.ExceptionObject;
//Writing the exception to log file with the stack flow
Logger.Logger.LogException("UNHANDLED EXCEPTION:"+Environment.NewLine +excep.ToString(), this);
//Terminate the logger (manual event waiting for file write to finish)
Logger.Logger.Terminate();
Environment.Exit(1);
}
しかし、私は吸入の例外を得る。私はそれがログに書かれているのを見ることができますが、アプリケーションは「プログラムが動作していません」というダイアログを表示します。 これはLogger.Terminate
行によって引き起こされる可能性がありますか? (また、terminateコマンドは、すべてのログがログファイルに書き込まれるまで待機します)
イベントハンドラもクラッシュする可能性があります。 Terminate()メソッドはかなり危険に思えます。 Environment.Exit()でも失敗する可能性がありますが、ファイナライザはまだ実行されています。または、Loggerクラスのバグのような愚かなものは、イベントハンドラで使用すると良くなりません。一般的に、あなたのプログラムでは何か面倒なことが起こったので、イベントハンドラを不安定にする可能性は決してゼロにはなりません。イベントをかなり遅く購読しているので、他の作業をする前にMain()メソッドで行う必要があります。 –
イベントハンドラが呼び出されないこともあります。いくつかの例外( 'StackOverflowException')は、ハンドラが実行される前にプロセス全体を停止させることができます。 – hvd
Guys-ログファイルで未処理の例外が表示され、ログファイルのfinilizingも表示されます。このイベントは処理されます。また、私は主な同じイベントがスレッドの例外をキャッチしている(ありがとう!) – Izikon