gpt4 book ai didi

c# - C# 中的 GC.Collect 和多线程

转载 作者:行者123 更新时间:2023-11-30 19:07:44 25 4
gpt4 key购买 nike

我正在使用 C# 3.5 和支持 C# 4 之前版本中的 TPL 的响应式(Reactive)扩展。

我的应用程序在几个地方调用了 GC.Collect()(是的,我知道我不应该手动调用这个方法,但至少这个问题请别管这一点)。在我放入多线程实现之前,它工作正常。 GC.Collect() 在每个线程中被调用,因此它在多线程上下文中被调用。

然后我用Task实现多线程,发现应用程序运行一段时间后,内存占用增加,线程停止正常工作。我声明“线程停止正常工作”是从多核计算机上的 CPU 使用率下降到单线程级别,而不是完全利用的场景开始的。

当我试图解决这个问题时,我唯一做的就是注释掉 GC.Collect() 调用,这一更改使线程工作正常。我想关闭 GC.Collect(),除非当我在我的应用程序中运行大的东西时,如果没有 GC.Collect(),我将遇到 OutOfMemory 异常。这就是我保持通话的原因。

现在谁能解释为什么在使用高内存的机器上的多线程上下文中调用 GC.Collect() 会导致多线程问题?有这方面的相关理论吗?非常感谢您的回答。

最佳答案

GC.Collect() 执行完整 垃圾收集,这将阻塞所有线程。它有一个重载 GC.Collect(int) 允许您指定要收集的世代。例如,GC.Collect(0) 只会收集第一代。不确定这是否会解决您的问题,但值得一试。

关于c# - C# 中的 GC.Collect 和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3732053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com