我应该在自定义线程池中调用GC.Collect吗?

时间:2010-12-16 03:52:36

标签: asp.net asp.net-mvc asp.net-mvc-2 asp.net-ajax c#-3.0

我创建了有5个线程的线程池。当我的应用程序启动时,它们都会启动。问题是我在每个线程上创建了线程循环回调函数中的这么多对象,并且在app运行时内存增加了第二个,这是线程循环回调函数:

  

void ThreadLoop(){
  而(真){
    var checkItems = _workItems.Where(w => w.ActivedTime> 3).ToList();
    foreach(checkItems中的var i){     
       _workItems [i.Id] .ActivedTime = 0;
  _workItems [i.Id] .ExecutePostBack();     
    }
    //重新创建新的_workItems字典
  _workItems = _workItems.Where(w => w.ActivedTime> 0).ToDictionary();
  //睡觉线程以释放妈妈   Thread.sleep代码(1000);
  // Call Grab collector free memory
      GC.Collect的();   
}   
}   

我很困惑,在每个线程上调用GC.Collect()是好还是坏?剂量会导致不良表现吗?

3 个答案:

答案 0 :(得分:1)

如果你不得不问自己是否要打电话给GC.Collect,答案肯定是“不”。 GC被设计为根据需要自动运行,并自己调用它说“我知道GC本身应该何时运行”。任何不了解GC细节的人更可能是错误的,而且实际上会让事情变得更糟。

最好的做法几乎总是让GC自己处理。

答案 1 :(得分:0)

调用GC.Collect是不明智的,除非你确实需要在某些角落情况下使用COM互操作。最好的情况是,你调用的GC超出了它的需要,最坏的情况是你可以将其他短期对象推广到更高的GC代,这使得以后清理它们的成本更高。

分配内存时,内存压力会触发GC,而不是时间。因此,如果你不再分配新对象,那么在内存中暂时出现长时间停顿的情况并不少见。在这种情况下,可以调用GC.Collect,但如果可以的话,我会避免在循环中调用它。

答案 2 :(得分:0)

在大多数情况下,您不需要调用GC.Collect(),除非在极少数情况下(我认为您不是)。有关详细说明,请参见此处:http://blogs.msdn.com/b/ricom/archive/2004/11/29/271829.aspx