【发布时间】:2010-09-17 01:14:58
【问题描述】:
我正在使用 C# 3.5 和在 C# 4 之前的版本中支持 TPL 的响应式扩展。
我的应用程序在多个地方调用了 GC.Collect()(是的,我知道我不应该手动调用此方法,但请至少在这个问题上保留这一点)。在我放入多线程实现之前,它工作正常。 GC.Collect() 在每个线程中被调用,所以它在多线程上下文中被调用。
然后我使用Task实现多线程,发现应用运行一段时间后,内存使用量增加,线程停止正常工作。我从多核计算机上的 CPU 使用率下降到单线程级别而不是完全利用的情况下声明“线程停止正常工作”。
当我试图解决这个问题时,我所做的唯一一件事就是注释掉 GC.Collect() 调用,这个更改使线程工作正常。我想关闭 GC.Collect(),除非当我在我的应用程序中运行一些大的东西时,如果没有 GC.Collect(),我会遇到 OutOfMemory 异常。这就是我保持通话的原因。
现在谁能解释为什么在使用高内存的机器上的多线程上下文中调用 GC.Collect() 会导致多线程问题?有没有关于这个位的相关理论?非常感谢您的回答。
【问题讨论】:
标签: c# multithreading