使用時にメモリリークがあります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);
「Exited」コールバックで、リソースを破棄します:
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」オブジェクトをキューから削除しました。
ドキュメントを読むと、concurrentqueue が参照をキューにコピーします。
メモリリークがどこにあるかを見つけるのを手伝ってもらえますか?