我要打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
短答:没有。
如果你打电话给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管理自己,它将根据可用资源等在每台机器上进行不同的优化。如果您自己调用它,可能会损害应用程序的性能。