バックグラウンドワーカーを持つ既存の計算オブジェクトを開いて接続するフォームがあります。バックグラウンド ワーカーが完了すると、メッセージが送信され、フォームは OnCompletion メソッドを実行します。このメソッドは、計算が失敗した場合にメッセージ ボックスを作成します。計算が失敗したとしましょう。その後、ユーザーは失敗に関するメッセージを受け取ります。フォームを閉じて、フォームの新しいインスタンスを開き、計算を再度実行します。再び計算が失敗し、フォームは OnCompletion メソッドを実行し、メッセージ ボックスでクラッシュします。
MessageBox.Show(this, message, title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
問題は、「これ」(フォーム)が処分されていることです。コードを変更して IsDiposed をテストする場合:
if (!IsDisposed)
MessageBox.Show(this, message, title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
その後、メッセージ ボックスは呼び出されませんが、OnCompletion メソッドがすぐにもう一度実行され、IsDiposed が false になり、メッセージ ボックスが正しく呼び出されることがわかります。
フォームが破棄されているかどうかを確認するテストで問題は解決しましたが、OnCompletion メソッドが 2 回呼び出された場合は、何か間違ったことをしているに違いないと思います。
OnCompletion への二重呼び出しは、元のフォームが閉じられている場合にのみ発生することに注意してください。その後、計算が実行されるたびに OnCompletion メソッドが 2 回呼び出され、this.IsDiposed は 1 回目は true、2 回目は false になります。
OnCompletion への二重呼び出しを停止するための説明または提案があれば、誰でもできます。