1

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

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;
}

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

4

2 回答 2

5

简短的回答:

如果你打电话GC.Collect(),你可能有问题。需要调用它是非常罕见的。

在您当前的示例中,给定当前代码将无济于事。除非您以物理方式清除对象列表Message,否则它们不会被垃圾回收,因为调用者仍然具有对该List<T>实例中对象的引用。

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

您可以通过从处理过的消息对象中删除消息对象List<T>,或者通过切换到固有地体现此原则的数据结构(例如 aQueue<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;
}
于 2013-03-04T16:25:19.713 回答
1

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

于 2013-03-04T16:24:16.793 回答