相关疑难解决方法(0)

ConcurrentBag导致内存泄漏吗?

可能重复:
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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的期望:将创建包并在方法"Func"处置.

我所看到的:bag永远不会被释放,保存在Parallel.ForEach中创建的所有线程,保存我添加的所有数据.=(

好的,当我将它添加到列表中时,我可以使用"TryTake"从包中删除项目.但空袋仍然留在记忆中.

现在我通过使用List而不是ConcurrentBag来解决问题.但是因为我在记忆中看到这个,所以我睡不好觉.抱歉我的eng =)

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();
}
Run Code Online (Sandbox Code Playgroud)

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

c# memory-leaks task-parallel-library concurrent-collections

3
推荐指数
1
解决办法
4729
查看次数