我创建了有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()是好还是坏?剂量会导致不良表现吗?
答案 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