2017-01-17 27 views
0

非同期待ちパターンを頻繁に使用するかなり大きなWPF Prismアプリケーションがあります。未処理の非同期例外が複数あるとMessageBoxが失敗する

私はまた、MessageBoxを表示し、次のようにすべてのイベントを使って正常にアプリケーションをシャットダウンするグローバル例外ハンドラを実装しました。

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
DispatcherUnhandledException += App_DispatcherUnhandledException; 
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; 

一度に1つの例外が発生すると、かなりうまく動作し、開発者は同期ロジックが間違っているとすぐに知ることができます。しかし、3つの未処理の例外が別々の非同期voidイベントハンドラから出てくる問題点がありました。

2ハンドルされていないイベントは、UIスレッドがあきらめて最後の例外をキューから取り除いたかのように、まったく関係のない以前の例外をスローすることによってMessageBox.Showが実際に失敗することを意味していました。 DispatcherUnhandledExceptionは一度だけ起動します。

3番目の例外は、Current.Domain.UnhandledExceptionに行き、その時点で既にアプリケーションをシャットダウンしようとしていたため、未処理のクラッシュが発生します。

だから私の質問は誰もこの行動を以前に見たことがありますか? Dispatcherで複数の例外がどのように処理されるかを説明するためのリソースを教えてください。理想的には、最初のものをキャッチして残りの部分をスローしたいのですが、2番目の例外はMessageBoxがまったく開かないようにします。

技術的に既にシャットダウンされているはずなので、この時点でDomain.UnhandledExceptionを無視する方法はありますか?

答えて

0

あなたは、このようなロックなどの同期プリミティブを導入することによって、これらのイベントハンドラスレッドセーフにしたいのでAppDomain.CurrentDomain.UnhandledExceptionTaskScheduler.UnobservedTaskExceptionイベントが複数のスレッドから調達することができる。

private readonly object _lock = new object(); 
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    lock (_lock) 
    { 
     //one one thread at a time can enter this critical section 
     MessageBox.Show("An error occured..."); 
     Environment.Exit(1); 
    } 
} 
関連する問題