使用时内存泄漏:
requestObject request = xxx;
Item obj= new Item ();
obj.MessageReceived += obj_MessageReceived;
obj.Exited += obj_Exited;
request.Key = obj.Key;
obj.AddRequest(request);
_queue.TryAdd(obj.Key, obj);
在“退出”回调中,我处理资源:
void LiveSphere_Exited(string key)
{
Item instance;
_queue.TryRemove(key, out instance);
Task.Factory.StartNew(() =>
{
var wait = new SpinWait();
while (instance.MessageCount > 0)
{
wait.SpinOnce();
}
})
.ContinueWith((t) =>
{
if (instance != null)
{
//Cleanup resources
instance.MessageReceived -= obj_MessageReceived;
instance.Exited -= obj_Exited;
instance.Dispose();
instance = null;
}
});
}
当我分析代码时,我仍然有一个根引用的“item”对象,但我不知道在哪里可以处理…,
退出的方法被触发,并且A队列从队列中删除了“item”对象。
当我阅读文档时,concurrentqueue将引用复制到队列中。
你能帮我找出内存泄漏的地方吗?
最佳答案
与标准.NET队列不同,调用dequeue()不会从集合中移除对对象的引用。虽然此行为已从4.0版本更改为4.5版本(我已阅读,但尚未对其进行测试),但它不是一个bug,而是框架团队在设计线程安全的可枚举集合时作出的有意识的设计决策。
This article有更多信息,包括使用StrongBox包装进入ConcurrentQueue的对象的解决方法。在转到4.5框架之前,这应该是一个合适的解决方案。