C# 强制GC使用另一个线程上下文
我正在使用OpenGL,有一些非托管对象需要手动处理。 (特别是纹理和顶点缓冲区) 问题是,释放vertexbuffer的函数绝对必须从主线程(唯一可以创建或销毁此类对象的线程)调用 我已经为我的托管对象正确地实现了IDisposable和析构函数。 垃圾收集器还正确调用函数。 但所有这些都注定会失败,因为垃圾收集器运行在不同的线程上,当GC调用释放函数(DeleteBuffers(…)、DeleteTexture(…)时,它会崩溃 所以我想出了两个办法来解决这个问题:C# 强制GC使用另一个线程上下文,c#,multithreading,garbage-collection,thread-safety,idisposable,C#,Multithreading,Garbage Collection,Thread Safety,Idisposable,我正在使用OpenGL,有一些非托管对象需要手动处理。 (特别是纹理和顶点缓冲区) 问题是,释放vertexbuffer的函数绝对必须从主线程(唯一可以创建或销毁此类对象的线程)调用 我已经为我的托管对象正确地实现了IDisposable和析构函数。 垃圾收集器还正确调用函数。 但所有这些都注定会失败,因为垃圾收集器运行在不同的线程上,当GC调用释放函数(DeleteBuffers(…)、DeleteTexture(…)时,它会崩溃 所以我想出了两个办法来解决这个问题: 将必须释放的对象添加到列
GCSettings.LatencyMode = GCLatencyMode.Batch;
这将停止在其他线程上运行GC
MSDN
禁用垃圾收集并发性并在
批处理调用。这是最具侵入性的模式。此模式专为
以牺牲响应能力为代价的最大吞吐量
您是否尝试过:
GCSettings.LatencyMode = GCLatencyMode.Batch;
这将停止在其他线程上运行GC
MSDN
禁用垃圾收集并发性并在
批处理调用。这是最具侵入性的模式。此模式专为
以牺牲响应能力为代价的最大吞吐量
这个想法很简单,因为您有一个队列(使用ConcurrentQueue实现线程安全) 让您的finlizer填充此队列,并让主循环清空它。 请尝试以下链接: SimplePenglControl.DisposingQueue是一个保存对OpenGL资源引用的队列。在程序执行期间定期访问它,处理其中包含的数据。请注意,“else”子句永远不会执行,除非您实际上忘记释放资源。这是两全其美的:您可以手动释放资源(不会影响性能),但如果您忘记了什么,垃圾收集器仍会在您之后进行清理。更好的是,实现非常简单!
现在,我们只需要了解如何处理多个OpenGL上下文。这个想法很简单,因为您有一个队列(使用ConcurentQueue实现线程安全) 让您的finlizer填充此队列,并让主循环清空它。 请尝试以下链接: SimplePenglControl.DisposingQueue是一个保存对OpenGL资源引用的队列。在程序执行期间定期访问它,处理其中包含的数据。请注意,“else”子句永远不会执行,除非您实际上忘记释放资源。这是两全其美的:您可以手动释放资源(不会影响性能),但如果您忘记了什么,垃圾收集器仍会在您之后进行清理。更好的是,实现非常简单! 现在,我们只需要了解如何处理多个OpenGL上下文