我应该打电话给GC.Collect

时间:2013-03-04 16:22:08

标签: c# garbage-collection

我有一个wcf服务作为Windows服务托管,具有以下功能:

public int SendMultipleMessages(List<Message> messages)
{
  foreach (var message in messages)
  {
     //Do some stuff with the messages ie. get an id to return, save info in a db.
  }

  //Would it make sence to collect here ??
  Gc.Collect();

  Task.Factory.StartNew(() =>
        {
            //very time demanding task
            _sendRequestHandler.SendMultipleMessages(BatchId);
        });

 return BatchId;
}

列表&lt;消息&gt;对象(通常情况下)通常使用高达1 GB的内存,在这样的情况下调用GC.Collect是有意义的,因为我不再使用该列表,或者我应该让垃圾收集器自己处理这个?

2 个答案:

答案 0 :(得分:5)

简短回答:

如果您致电GC.Collect(),可能会遇到问题。这是非常罕见的。

在您当前的示例中,在给出当前代码时无效。除非您物理清除 Message个对象列表,否则它们不会被垃圾收集,因为调用者仍然具有<{1}}中对象的引用实例

当然,该建议基于以下假设:每个List<T>对象都不存在其他引用。

您可以通过从Message处理消息对象后删除消息对象,或者切换到本质上体现此原则的数据结构,例如{{1} }或List<T>取决于您的订购要求。

Queue<T>

答案 1 :(得分:1)

让GC管理自己,根据可用的资源等因素在每台机器上进行不同的优化。您自己调用它可能会影响应用程序的性能。