C#(WPF)数据表内存管理(建议指南)

C#(WPF)数据表内存管理(建议指南),c#,wpf,memory-management,memory-leaks,garbage-collection,C#,Wpf,Memory Management,Memory Leaks,Garbage Collection,我正在使用WPF,我在使用内存释放编写的应用程序中遇到了一些问题。 我看了很多帖子和博客等,无法摆脱这个问题 我决定从头开始编写一个简单的wpf应用程序,只完成一项任务 问题 我希望有多个数据表,并将数据存储到其中,然后清除它们。 一旦数据表被清除,内存也应该被清除 问题是我发现记忆永远不会消失 测试应用程序 我的主窗口中有一个数据表,有几个按钮 添加数据(循环大约100000次,并将数据添加到数据表中,数据表是一个整数和一个字符串) 数据表的Call.Clear() 将数据表设置为空 报告存储

我正在使用WPF,我在使用内存释放编写的应用程序中遇到了一些问题。 我看了很多帖子和博客等,无法摆脱这个问题

我决定从头开始编写一个简单的wpf应用程序,只完成一项任务

问题

我希望有多个数据表,并将数据存储到其中,然后清除它们。 一旦数据表被清除,内存也应该被清除

问题是我发现记忆永远不会消失

测试应用程序

我的主窗口中有一个数据表,有几个按钮

  • 添加数据(循环大约100000次,并将数据添加到数据表中,数据表是一个整数和一个字符串)
  • 数据表的Call.Clear()
  • 将数据表设置为空
  • 报告存储器
  • 调用垃圾收集器
  • 按钮2和3对探查器中的内存没有影响。 我点击了添加数据3或4次,它按预期循环并添加数据,当然内存会增加。 现在是128MB,这很好

    接下来,我调用.Clear(),我希望在加载应用程序时,内存会返回到内存中,该应用程序的容量为73MB

    我等了几分钟,可以看到垃圾收集器正在运行,但没有拾取数据表。我想要10分钟,但什么都没有,内存仍然保持在128MB

    我读到垃圾回收器应该单独处理它自己的事情,它不应该被调用,但是如果我调用垃圾回收器,内存将被释放,尽管我不确定它是否完全返回到应用程序启动时的初始内存使用情况

    那么我做错了什么?

    我应该如何执行这样的任务,如向数据表中添加数据,对其进行处理,然后将其清除以供以后使用?

    我的数据表是主窗口的一部分导致引用,所以垃圾收集器不会收集它吗?如果是这样,为什么执行GC.Collect部分有效? 例如,以73MB启动应用程序,执行上一步,然后运行GC,我得到93MB。 为什么我还有20MB,为什么我必须手动运行它

    调用GC.Collect有多糟糕,还有其他方法吗

    private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (dt == null)
            {
                dt = new DataTable();
            }
            if (dt.Columns.Count == 0)
            {
                dt.Columns.Add("number", typeof(int));
                dt.Columns.Add("text", typeof(string));
            }
    
            for (int i = 1; i < 100000; i++)
            {
                Debug.WriteLine(i);
                DataRow dr = dt.NewRow();
                dr["number"] = i;
                dr["text"] = "hello world";
                dt.Rows.Add(dr);
            }
            GetMemory();
        }
    
    private void按钮\u单击(对象发送者,路由目标)
    {
    如果(dt==null)
    {
    dt=新数据表();
    }
    如果(dt.Columns.Count==0)
    {
    添加(“编号”,类型(int));
    添加(“文本”,类型(字符串));
    }
    对于(int i=1;i<100000;i++)
    {
    Debug.WriteLine(i);
    DataRow dr=dt.NewRow();
    dr[“number”]=i;
    dr[“text”]=“你好,世界”;
    dt.Rows.Add(dr);
    }
    GetMemory();
    }
    
    我试图为数据表创建一个属性,但没有任何区别,直到我手动调用GC,内存达到60MB,这比加载应用程序时要少。 我等了34分钟才手动按下GC按钮


    完全混淆任何帮助、学习材料或最佳实践的方向将是最受欢迎的。

    也许这会有所帮助:这看起来像是很棒的文档,我需要一段时间来通读,所以我不能说它解决了问题,但我会看一看。到目前为止,它肯定有我需要的东西。在进一步播放之后,我点击添加按钮,直到我达到1GB的内存,我可以看到GC实际上收集了“一些”内存,但对我来说,这似乎是垃圾?为什么我想让我的记忆看起来像是86%被使用了。另外,如果我清除DataTable并将其设置为null,然后运行GC,它将下降到86MB,这非常棒,但我不应该调用GC。我需要弄清楚那部分。