我正在使用 OpenGL,我需要手动处理一些非托管对象。(特别是纹理和顶点缓冲区)。
问题是,释放顶点缓冲区的函数绝对必须从主线程(唯一可以创建或销毁此类对象的线程)调用。
我已经为我的托管对象正确实现了 IDisposable 和析构函数。垃圾收集器也正确调用函数。但是这一切都注定要失败,因为垃圾收集器在不同的线程上运行,当 GC 调用释放函数(DeleteBuffers(...)、DeleteTexture(...) 等)时,它会崩溃。
所以我想出了两个想法来解决这个问题:
将必须释放的对象添加到列表中,然后在主线程中检查该列表。问题:需要我想避免的同步/锁定。也许使用 BlockingCollection<> ?
不知何故,强制 GC 使用主线程来完成它的工作。
有没有我不知道的方法可以做到这一点?我应该如何正确处理这些对象?我必须自己清理吗?(意思是我停止使用析构函数并总是自己释放对象?)