1

ある種の PA システムで使用される複雑な WPF アプリケーションがあります。時々ビデオを表示し、画面上で音楽やさまざまなテキストメッセージを再生することもあります.

構造はかなり簡単です。2つのメソッドを持つサーバーがあります。SetMessage("文字列"); および GetMessage("文字列");

クライアントは 5 秒に 1 回、WCF の HTTP バインディングを介してサーバーに接続し、GetMessage() をプルします。管理アプリはサーバーに接続し、SetMessage() を呼び出します。

App.xml.cs には、CurrentDomain_UnhandledException、OnDispatcherUnhandledException、TaskScheduler.UnobservedTaskException、および application.Current.DispatcherUnhnandledException のハンドラーがあります。それらはすべて nlog を実行して操作を続行することを想定しています。

アプリには、Media 要素を使用して短いビデオを再生するページが 1 つあります。ビデオを再生した後、時々アプリがクラッシュします。

EventType : clr20r3
P1        : Client.exe
P2        : 0.0.2.0
P3        : 5226863e
P3        : mscorlib
P5        : 4.0.0.0
P6        : 4ba1da6f
P7        : 219
P8        : 10
P9        : system.invalidoperaionexception

これですべてクールです。それでも問題は次のとおりです。

  1. 4 つの異なる例外ハンドラーにもかかわらず、私はまだ例外を取得しています
  2. クライアント コンピューターでデバッグできません
  3. エラーはランダムですが、ビデオを再生した後に発生します。
  4. ビデオを停止および開始するコードは、Dispatcher.Invoke(new Action) にあります。
  5. ビデオを停止する前に、ページを離れて別のページに切り替えるだけかもしれません。

アクセスに違反していて、コード内の何かを別のスレッドから変更しようとしているようです。

面白いことに、ILDasm を実行しようとしたところ、P7:219 が見つかりましたが、コードには何もありません。

そのおかしな例外をキャッチする方法はありますか?

(私は実際にここで同様の問題を見つけようとして約 30 分を費やしましたが、すべてのソリューションは既に私のコードに適用されています)

助けてくれてありがとう。

4

2 に答える 2

1

独自のディスパッチャーを使用して新しいスレッドをどこかで開始していると思います。このリンクhttp://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception
で msdn のコメントをご覧ください。
.aspx

DispatcherUnhandledException は、メイン UI スレッドで実行されているコードによって処理されない例外ごとに、アプリケーションによって発生します。バックグラウンド ユーザー インターフェイス (UI) スレッド (独自の Dispatcher を持つスレッド) またはバックグラウンド ワーカー スレッド (Dispatcher を持たないスレッド) で例外が処理されない場合、例外はメイン UI スレッドに転送されません。したがって、DispatcherUnhandledException は発生しません。このような状況では、次のことを行うコードを記述する必要があります。 バックグラウンド スレッドで例外を処理します。これらの例外をメイン UI スレッドにディスパッチします。DispatcherUnhandledException が発生するように、それらを処理せずにメイン UI スレッドで再スローします。

このすべての例外ハンドラーを実装している場合でも、独自のディスパッチャーでバグをキャッチすることはできません。

これがあなたを助けることを願っています

于 2013-09-12T18:51:08.290 に答える
0

やっぱり簡単でした。

問題を解決するためのトレース スタックがありませんでした。nlog、WER、その他多くのことを試みましたが、実際のトレース スタックを取得できませんでした。

そして、興味本位で Windows ログをチェックすることにしたとき、エラーのログの後、Windows がスタック トレースをログに記録したことがわかりました。数秒でエラーを見つけることができました。

スレッドプールでの作業で発生した例外に問題がありました。

于 2013-09-13T15:47:48.233 に答える