私は OpenGL を使用していますが、手動で破棄する必要があるアンマネージド オブジェクトがあります。(特にテクスチャと頂点バッファ)。
問題は、頂点バッファを解放する関数が絶対にメインスレッド (そのようなオブジェクトを作成または破棄できる唯一のスレッド) から呼び出されなければならないことです。
管理対象オブジェクトの IDisposable とデストラクタを既に正しく実装しています。ガベージ コレクターも関数を正しく呼び出します。しかし、ガベージ コレクターは別のスレッドで実行され、GC が解放関数 (DeleteBuffers(...)、DeleteTexture(...) など) を呼び出すとクラッシュするため、これはすべて失敗することになります。
そこで、これを解決するために 2 つのアイデアを思いつきました。
解放する必要があるオブジェクトをリストに追加し、メイン スレッドでそのリストを確認します。問題: 回避したい同期/ロックが必要です。おそらく BlockingCollection<> を使用しますか?
どういうわけか、GC がメインスレッドを使用してその仕事を行うように強制します。
これを行う方法がわかりませんか?これらのオブジェクトを正しく処分するにはどうすればよいですか? 自分でクリーンアップする必要がありますか? (つまり、デストラクタの使用をやめて、常に自分でオブジェクトを解放しますか?)