我应该打电话给GC.Collect

Nic*_*lai 1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

use*_*116 5

简答:.

如果你打电话GC.Collect(),你可能有问题.这是非常罕见的.

在您当前的示例中,它对当前代码没有帮助.除非您在物理上清除Message对象列表,否则它们不会被垃圾收集,因为调用者仍然具有对该List<T>实例中对象的引用.

当然,该建议是基于每个Message对象不存在其他引用的假设.

你可能通过从该消息的对象添加一些更确定性对您的过程List<T>,他们都已经被处理过一次,或者通过切换到一个数据结构,它体现了这一原则本身,如Queue<T>Stack<T>对您的订购需求依赖.

public int SendMultipleMessages(Queue<Message> messages)
{
  while (messages.Count > 0)
  {
     var message = messages.Dequeue();
     // do something with message, and once you're done it is
     // probably eligible for garbage collection because it is
     // no longer in the Queue
  }

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

 return BatchId;
}
Run Code Online (Sandbox Code Playgroud)