tôi có rò rỉ bộ nhớ khi sử dụng ConcurrentQueue
:Memory rò rỉ với 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);
Trong "thoát" gọi lại, tôi định đoạt tài nguyên:
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;
}
});
}
Khi tôi hồ sơ mã, tôi vẫn còn có một gốc tham chiếu "Item" đối tượng nhưng tôi không biết nơi tôi có thể xử lý ..., Phương pháp đã thoát được kích hoạt và _queue đã loại bỏ đối tượng "Item" khỏi hàng đợi.
Khi tôi đọc tài liệu, đồng thời sao chép tham chiếu vào hàng đợi.
Bạn có thể giúp tôi tìm ra nơi rò rỉ bộ nhớ không?
Không chắc chắn nơi rò rỉ bộ nhớ của bạn. Đã có một rò rỉ bộ nhớ trong phiên bản .NET 4.0 của 'ConcurrentQueue', nhưng nó đã được sửa cho 4.5. Bạn có thể cân nhắc xem xét 'BlockingCollection', một trình bao bọc đẹp hơn nhiều xung quanh các bộ sưu tập đồng thời. Hành vi mặc định được sử dụng 'ConcurrentQueue' trong nội bộ. –
Tôi ngần ngại gọi sự rò rỉ 'ConcurrentQueue' của .NET 4 - chủ yếu chỉ xảy ra nếu bạn không sử dụng nó nhiều (nó sẽ không đặt dữ liệu thành 'null' cho đến khi một số mục được xuất hiện) - trong trường hợp này , điểm của 'ConcurrentQueue' là gì? –
Cảm ơn bạn Jim nhưng tôi đã có .NET 4.5 và tôi cần hàng đợi FIFO, bộ sưu tập chặn là FIFO? – dnx