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