5

未処理の例外ハンドラーがあります。それは素晴らしいGUIを示し、ユーザーがエラーレポートを送信できるようにします。ユーザーは自分の名前や電話番号などを残すこともでき、サポート部門から折り返し電話があります。うまく機能し、見栄えが良く、顧客の怒りを和らげます。理論的には、とにかく。

問題は、私のアプリケーションがバックグラウンドスレッドを使用していて、たとえばGUIスレッド(理にかなっている)などで例外がスローされてもスレッドが気にしないようで、作業を続行することです。その結果、ユーザーがカスタム例外ハンドラウィンドウを十分に長く開いたままにすると、WERダイアログがポップアップ表示され、エラーハンドラ自体がクラッシュしたように見えます。

例外ハンドラのスコープ内のスレッドオブジェクトにアクセスできないため、それらを一時停止できません。スレッドオブジェクトをグローバルにアクセス可能にすることも解決策ではありません。今のところ私の回避策はGlobals.Crashed = true;、例外ハンドラーのようなものを使用し、ループの反復ごとにスレッドメソッドにそのプロパティをチェックさせることです。完璧ではありませんが、ダメージを最小限に抑えます。

ハッキーでない方法を知っている人はいますか?私のアプローチは間違っていますか?WERと同じように実行し、メインプログラムを一時停止してエラーUIを表示する外部プログラムを起動する必要がありますか?

4

3 に答える 3

5

ハンドルされていない未知の例外がある場合、何かが発生し、プログラムが最も単純なことでさえ失敗する可能性があると想定できます。たとえば、使用可能なすべてのメモリを消費した場合を考えてみましょう。この場合、おそらくメモリを割り当てる必要があるため、エラー レポートを送信することもできません。

適切なアプローチは、エラー報告だけを行う別の小さなアプリケーションを作成することです。そのアプリケーションは、レポートする詳細をファイルから取得できます。そうすれば、不明な例外ハンドラーは次のようになります。

  • 一時ディレクトリ内のファイルに情報をダンプします。
  • ファイル名を引数としてエラー報告アプリを起動します。
  • 愚かなことをする前に、失敗したプロセスを終了します。

一時ファイルは、エラー報告アプリによって削除する必要があります。

于 2010-08-20T19:53:58.780 に答える
0

グローバルな Collection オブジェクトですべてのスレッドを追跡できるため、ハンドラーが実行されると、コレクション オブジェクトを単純に反復処理し、そこでスレッドを中止することができます。

于 2010-08-20T19:51:59.207 に答える
0

この質問Suspend Process in C#のコードを見てください。GUI スレッドと、開始したバックグラウンドではないものを一時停止しないように微調整する必要がありますが、うまくいくはずです。

ただし、エラー レポート GUI を別のプロセスとして起動して、必要な情報を渡してから、未処理の例外ハンドラーから元のプロセスを強制終了することをお勧めします。 .

于 2010-08-20T19:57:47.713 に答える