gpt4 book ai didi

c# - ConcurrentQueue 内存泄漏

转载 作者:太空狗 更新时间:2023-10-29 18:29:28 37 4
gpt4 key购买 nike

我在使用 ConcurrentQueue 时发生内存泄漏:

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”对象,但我不知道我可以在哪里处理...,exited 方法被触发,_queue 已从队列中删除“Item”对象。

当我阅读文档时,并发队列将引用复制到队列中。

你能帮我找出内存泄漏的地方吗?

最佳答案

与标准 .NET 队列不同,调用 Dequeue() 不会从集合中删除对对象的引用。虽然此行为已从 4.0 版本更改为 4.5 版本(我已阅读此内容,但尚未测试)它不是错误,而是框架团队作为设计线程安全的一部分做出的有意识的设计决定, 可枚举集合。

This article有更多信息,包括使用 StrongBox 包装进入 ConcurrentQueue 的对象的解决方法。在您可以迁移到 4.5 框架之前,这应该是一个合适的解决方法。

关于c# - ConcurrentQueue 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14041373/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com