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% 発生し、他の場所では決して発生しません。
何か案は?