我在测试代码中注意到使用ConcurrentQueue<>在Dequeueing之后以某种方式不释放资源并最终耗尽内存。或者垃圾收集不经常发生。
以下是代码片段。我知道ConcurrentQueue<>存储引用,是的,我确实希望每次创建一个新对象,所以如果入队比出队更快,内存将继续上升。还有内存使用的截图。为了测试,我发送了5000个字节的数组,每个数组包含500000个元素。
有一个类似的问题:
ConcurrentQueue holds object's reference or value? "out of memory" exception
并且该帖子中提到的所有内容都是我所经历的......除了在出队后内存不会释放,即使队列被清空也是如此。
我很感激对此的任何想法/见解。
ConcurrentQueue<byte[]> TestQueue = new ConcurrentQueue<byte[]>();
Task EnqTask = Task.Factory.StartNew(() =>
{
for (int i = 0; i < ObjCount; i++)
{
byte[] InData = new byte[ObjSize];
InData[0] = (byte)i; //used to show different array object
TestQueue.Enqueue(InData);
System.Threading.Thread.Sleep(20);
}
});
Task DeqTask = Task.Factory.StartNew(() =>
{
int Count = 0;
while (Count < ObjCount)
{
byte[] OutData;
if (TestQueue.TryDequeue(out OutData))
{
OutData[1] = 0xFF; //just do something with the data
Count++;
}
System.Threading.Thread.Sleep(40);
}