可能的重复:
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”处处理。
我看到的是:bag 永远不会释放,保存在 Parallel.ForEach 中创建的所有线程,保存我添加到其中的所有数据。 =(
好的,当我将其添加到列表中时,我可以使用“TryTake”从包中删除该项目。但空袋子仍然留在记忆中。
现在我通过使用 List 而不是 ConcurrentBag 来解决问题。但自从我在记忆分析器中看到这一点后,我就睡不好觉了。对不起我的英语=)
UPDATE
我改变我的方法“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(抱歉,只是不能发图片)