3

私のアプリケーションは通常10〜20のスレッドで実行されており、これらのスレッドはGUIにイベントを送信して、ほぼ毎秒特定のコントロールを更新します。

ユーザーがこれらの途中でアプリケーションを閉じると、これらのイベントに関連するすべての更新により、いくつかのランダムなクラッシュが発生します。主ObjectDisposedExceptionにとNullReferenceException

イベントは既にスローされていますが、.NET Frameworkによってまだ処理されていないため、キャンセルできる状態ではありません。

これを処理する最善の方法についてはよくわかりません。現在、私は例外を飲み込んでいます。

4

2 に答える 2

4

いくつかのオプション:

  • アプリが閉じ始めると(FormClosing?)、スレッドをきれいに終了し始めることができます(どこかのフラグを介して)
  • おそらくUIと通信するために、UIによって処理されるイベント(同期などを処理する)を発生させます-フラグを保持し、(安全に実行できる場合は)フラグが設定されている場合は単にイベントをドロップします(ここでも、終了しているため)
  • 終了するときに、UIにイベントのサブスクライブを解除させます
于 2009-05-01T07:23:27.317 に答える
1

Marc Gravellの提案に加えて、さらにいくつかのことがあります。

  • どの時点からでも、例外Environment.HasShutdownStartedを引き起こす可能性のあることを行う前に確認できますObjectDisposed
  • Windowsフォームにアクセスしている場合は、確認できます.IsDisposed(すべてのフォームとコントロールにアクセスできます)
于 2009-05-01T08:18:49.070 に答える