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是有意义的,因为我不再使用该列表,或者我应该让垃圾收集器自己处理这个?
简答:不.
如果你打电话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)