プログラムがクラッシュした後、すべてのスレッドを中断するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3534363

質問

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

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

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

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

役に立ちましたか?

解決

手持ちのない未知の例外がある場合、何でも起こり、プログラムが最も単純なことさえできないと仮定することができます。使用可能なすべてのメモリを消費した場合を考えてみましょう。おそらくメモリを割り当てる必要があるため、エラーレポートを送信することもできません。

良いアプローチは、書くことです 分ける エラーレポートを行うだけの小さなアプリケーション。そのアプリケーションは、ファイルから報告するために詳細を選択できます。そうすれば、あなたの未知の例外ハンドラーは次のとおりです。

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

TEMPファイルは、エラーレポートアプリで削除する必要があります。

他のヒント

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

この質問のコードを見てください、 C#でプロセスを一時停止する, 、GUIスレッドを停止しないように微調整する必要があります。

ただし、より良いオプションは、エラーレポートGUIを個別のプロセスとして試して起動し、必要な情報を渡し、潜在的に破損した状態で何かを実行できるようにするのではなく、未処理の例外ハンドラーから元のプロセスを殺すことです。 。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top