IBM メインフレームと対話する COM ライブラリのラッパーを作成しています。単一のスレッドからのみアクセスできます。これを回避するために、System.Windows.Threading.Dispatcher を作成して、専用スレッドでのすべての対話の実行を処理しました。
私の問題は、オブジェクトが明示的に破棄されていない場合、WinForm アプリケーションが終了した後もディスパッチャが実行され続けることです。ディスパッチャを作成するオブジェクトに対して finalize メソッドが呼び出されることはありません。不要な接続を防ぐために、セッションを確実に閉じる必要があります。
アプリケーションの終了時に GC.Collect を呼び出すと、問題なく終了します。ただし、私が作成したライブラリは、ほとんどが経験の浅い開発者によって使用されます。アプリケーションの終了イベントにフックするために、それらが常に破棄、ガベージの収集、またはWinFormsまたはWPFのいずれかにコミットすることを期待することはできません。
クラスにファイナライザーがある場合、そのクリーンアップは後で延期されることを読みました。それは問題の一部かもしれませんが、ファイナライザーを回避できますか?