1 つのフォームでのみ発生するように見える非常に奇妙な動作があります。
基本的に私は のインスタンスを作成し、ノンブロッキングでフォームを表示するためFormに呼び出しています。Show()そのフォームのイベント ハンドラーには、特定の状況でLoad呼び出されるロジックがいくつかあります。this.Close()これはフォームを閉じますが、クライアント コードのフォームShow()メソッドはObjectDisposedException.
ObjectDisposedException からのスタック トレースは次のとおりです。
System.Windows.Forms.Control.CreateHandle()
で System.Windows.Forms.Form.CreateHandle()
で System.Windows.Forms.Control.get_Handle() で System.Windows.Forms.ContainerControl.FocusActiveControlInternal()
で System.Windows.Forms.ContainerControl.FocusActiveControlInternal()
で.Windows.Forms.Form.SetVisibleCore(Boolean value)
at System.Windows.Forms.Control.Show()
...など。
これは私が見ているものです:
Control.Show()と呼ばれる- 私のフォームが起動されました
OnFormLoadメソッドが呼び出されますFormLoadイベントハンドラーが呼び出され、その中で呼び出しますthis.Close()OnFormClosingメソッドが呼び出されますFormClosingイベントハンドラが呼び出されますDispose私のフォームとすべてのユーザーコントロールで呼び出されます
そして、Control.Show()メソッドの最後のどこかで、フォームへのハンドルを取得しようとしますが、オブジェクトが破棄されているとマークされているため、例外が発生して例外がスローされます。
私の本当の質問は、例外なく他のすべてのフォームでこれとまったく同じことを実行できるのはなぜですか? それはGCの問題ですか?GC.Collect()の直後に電話をかけてみましthis.Close()たが、違いはありません。私が言ったように、子ユーザー コントロール、フォーム変数のスコープなどに関係なく、このフォームでは 100% 発生し、他の場所では決して発生しません。
何か案は?