mam wyciek pamięci podczas korzystania ConcurrentQueue
:przeciek pamięci z 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);
W "Exited" zwrotnego, i dysponowania zasobu:
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;
}
});
}
Kiedy profil kodu, mam jeszcze obiekt odniesienia "obiekt", ale nie wiem, gdzie mogę go wyrzucić ..., Wywołana metoda jest wyzwalana, a funkcja _queue usunęła obiekt "Obiekt" z kolejki.
Gdy czytam dokumentację, współbieżna kopia kopiuje odwołanie do kolejki.
Czy możesz mi pomóc dowiedzieć się, gdzie jest wyciek pamięci?
Nie wiesz, gdzie znajduje się wyciek pamięci. Wystąpił przeciek pamięci w wersji "ConcurrentQueue" .NET 4.0, ale został naprawiony na 4.5. Możesz rozważyć zapoznanie się z 'BlockingCollection', który jest znacznie ładniejszym opakowaniem wokół zbieżnych kolekcji. Domyślne zachowanie używało 'ConcurrentQueue' wewnętrznie. –
Wahałbym się, że zadzwoniłbym do '.A4 4' ConcurrentQueue' - głównie działo się to tylko wtedy, gdy nie korzystałeś z niego zbyt wiele (nie ustawiłoby to danych na 'null', dopóki nie pojawiło się kilka elementów) - w takim przypadku , jaki jest sens "ConcurrentQueue"? –
Dziękuję Jim, ale już jestem w .NET 4.5 i potrzebuję kolejki FIFO, czy kolekcja blokująca to FIFO? – dnx