C# で描画時やアプリケーションの終了時に ObjectDisposedException が発生するのを防ぐ方法

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

  •  01-07-2019
  •  | 
  •  

質問

私は CompSci の学生で、C# についてはかなり初心者で、クラスで「ヨセフスの問題」プログラムを作成していました。いつでも終了できるように Application.Exit() を呼び出す終了ボタンを作成しました。ただし、C# がまだ残っている場合は、ペイント作業中にボタンが押されると、Graphics オブジェクトに対して ObjectDisownedExeception がスローされます。これを防ぐ方法はありますか?ブール値をキャッチまたは変更して、ペイント プロセスを終了する前に停止するように指示しようと考えていましたが、別の解決策があるかどうか知りたいです。{}

役に立ちましたか?

解決

そんなことはあり得ないはずだ。ボタンがウィンドウと同じスレッド上に作成された場合、それらはメッセージ ポンプを共有するため、ペイント ハンドラーを中断して終了ボタンを処理することはできません。ボタンがクリックされたというメッセージは、ペイント ハンドラーが戻るまでスレッドのメッセージ キューに入れられます。

一般に、ペイントを Paint ハンドラーに延期し (または OnPaint をオーバーライドし)、画面を更新する必要がある他の場所では、コントロールの Invalidate メソッドを呼び出します。これにより、領域を再描画する必要があることが Windows に伝えられ、他のすべてのメッセージが処理されると、 WM_PAINT このメッセージは最終的に OnPaint を呼び出し、次に Paint イベントを起動します。

アニメーション化する場合は、 System.Windows.Forms.Timer スレッドを使用するのではなく、各フレームをトリガーします。 System.Threading.Timer コールバックはスレッドプールで実行されるため、UI を操作するには常に間違ったスレッド上で実行されます。

他のヒント

フォームを正常に閉じるには、ボタンを含むフォームの Close() メソッドを呼び出す必要があります。メイン フォームを閉じると、アプリケーションが終了します。

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