我要打gc吗?对方付费?

本文关键字:方付费 gc 我要 | 更新日期: 2023-09-27 18:02:03

我有一个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;
}

List object(通常情况下)使用最多1gb的内存,调用GC有意义吗?在这样的情况下收集,因为我不再使用列表,或者我应该让垃圾收集器自己处理这个?

我要打gc吗?对方付费?

短答:没有

如果你打电话给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;
}

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