Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强制GC使用另一个线程上下文_C#_Multithreading_Garbage Collection_Thread Safety_Idisposable - Fatal编程技术网

C# 强制GC使用另一个线程上下文

C# 强制GC使用另一个线程上下文,c#,multithreading,garbage-collection,thread-safety,idisposable,C#,Multithreading,Garbage Collection,Thread Safety,Idisposable,我正在使用OpenGL,有一些非托管对象需要手动处理。 (特别是纹理和顶点缓冲区) 问题是,释放vertexbuffer的函数绝对必须从主线程(唯一可以创建或销毁此类对象的线程)调用 我已经为我的托管对象正确地实现了IDisposable和析构函数。 垃圾收集器还正确调用函数。 但所有这些都注定会失败,因为垃圾收集器运行在不同的线程上,当GC调用释放函数(DeleteBuffers(…)、DeleteTexture(…)时,它会崩溃 所以我想出了两个办法来解决这个问题: 将必须释放的对象添加到列

我正在使用OpenGL,有一些非托管对象需要手动处理。 (特别是纹理和顶点缓冲区)

问题是,释放vertexbuffer的函数绝对必须从主线程(唯一可以创建或销毁此类对象的线程)调用

我已经为我的托管对象正确地实现了IDisposable和析构函数。 垃圾收集器还正确调用函数。 但所有这些都注定会失败,因为垃圾收集器运行在不同的线程上,当GC调用释放函数(DeleteBuffers(…)、DeleteTexture(…)时,它会崩溃

所以我想出了两个办法来解决这个问题:

  • 将必须释放的对象添加到列表中,然后在主线程中检查该列表。 问题:需要同步/锁定,我希望避免这种情况。 也许使用BlockingCollection

  • 以某种方式强制GC使用主线程来完成其工作

  • 有没有一种我不知道的方法? 我应该如何正确处理这些对象? 我必须自己打扫吗?(意思是我停止使用析构函数,总是自己释放对象?

    您尝试过:

    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上下文