我有內存泄漏內存泄漏使用ConcurrentQueue
時:與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」對象的根,但我不知道我可以在哪裏處理..., 已激活的方法被觸發,並且_queue已從隊列中刪除了「Item」對象。
當我閱讀文檔時,concurrentqueue將引用複製到隊列中。
你能幫我找出內存泄漏是什麼?
不知道你的內存泄漏的地方。 「ConcurrentQueue」的.NET 4.0版本中存在內存泄漏,但已修復爲4.5。你可能會考慮研究'BlockingCollection',這是一個更好的併發集合包裝。默認行爲在內部使用'ConcurrentQueue'。 –
我不願意調用.NET 4的'ConcurrentQueue'漏洞 - 主要是這種情況只發生在你沒有使用它的情況下(直到有多個項目被彈出時它纔會將數據設置爲null) - 在這種情況下,ConcurrentQueue的意義何在? –
謝謝吉姆,但我已經在.NET 4.5中,我需要FIFO隊列,阻塞集合是FIFO? – dnx