gpt4 book ai didi

c# - ConcurrentBag 是内存泄漏的原因吗?

转载 作者:行者123 更新时间:2023-11-30 13:49:31 24 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Possible memoryleak in ConcurrentBag?

我的应用中出现严重内存泄漏。我使用其中一种方法添加到本地 concurrentBag 集合中的所有数据从未被收集。

这个简单的代码演示了我是如何使用它的:

void Main()
{
var l = new List<int>(){1,2,3,4};
Func(l);
l.Clear();
l=null;
}

void Func(List<int> list)
{
var bag = new ConcurrentBag<int>();
Parallel.ForEach(list, k=> bag.Add(++k));

list.Clear();

foreach(int i in bag) //I know, I doing it wrong.
{
list.Add(i);
}
}

我期望的是:袋子将在方法“Func”处创建和处置。

我所看到的:包永远不会被丢弃,保存在 Parallel.ForEach 中创建的所有线程,保存我添加到其中的所有数据。 =(

好的,当我将项目添加到列表中时,我可以使用“TryTake”从包中删除项目。但是空袋子仍然留在内存中。

现在我通过使用 List 而不是 ConcurrentBag 来解决问题。但自从我在内存分析器中看到这个后,我睡不好觉。对不起我的工程师 =)

更新

我改变了我的方法“Func”:

void Func(List<int> list)
{
var bag = new ConcurrentBag<int>();
Parallel.ForEach(list, k=> bag.Add(++k));

list.Clear();

int i;
while(bag.TryTake(out i))
{
list.Add(i);
}

bag = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}

然后我在 VS 中创建项目,编译并运行我的程序。这个实例图是由“.Net Memory Profiler 4.0”从内存快照创建的,我在程序完成所有工作后 10 分钟内收集:

http://xmages.net/storage/10/1/0/f/d/upload/4c67f305.jpg(抱歉,不能发图片)

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com