Dispose(bool)メソッドが呼び出されるスレッドを確認しました。アプリケーションが実行されているときは、フォームを閉じるために[x]をクリックすると、Disposeを呼び出すのは常にUIスレッドです。しかし、アプリケーション全体を閉じると、多くのDisposeメソッドが(単一の)別のスレッドで呼び出されます。スタックトレースをダンプすると、すべてが System.ComponentModel.Component.Finalize()から呼び出されることがわかります。UI以外のスレッドでComponent.Finalize()を呼び出すと、Disposeメソッドは常にスレッドセーフでなければならないのでしょうか?
これは、すべてのDisposeメソッドをスレッドセーフにする必要があることを意味しますか?あるいは、WinFormsは、UIスレッドがこれ以上オブジェクトに触れないことを保証しています。また、UIスレッドと現在終了しているものとの間に何らかの "起こった"関係が確立されていますか?
"通常は"ぼやけて見えますが、WinFormsでは、ファイナライザスレッドがその作業を行うときに元のUIスレッドがもう実行されないことが保証されていれば、それでいいです。 –
さて、通常、私はあなたのDisposeメソッドに同期の問題があることを意味していました。その中の共有リソースにアクセスしようとすると...しかし、ファイナライザが実行されているときに他のすべてのスレッドが中断されていることが保証されています。 –