如何解决C#WPF数据表内存管理建议|指导
我正在使用WPF,并且我使用内存释放编写的应用程序遇到了一些问题。 我看了很多帖子和博客等,无法摆脱这个问题。
我决定从头开始编写一个简单的wpf应用程序,仅执行一项任务。
问题
我想要多个数据表并将数据存储到它们,然后清除它们。 清除数据表后,也应清除内存。
问题是我发现内存永远无法清除...
测试应用
我的主窗口中有一个数据表,有几个按钮。
- 添加数据(循环大约100,000次并将数据添加到数据表中,该数据是整数和字符串)
- 调用.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();
}
我试图为数据表创建一个属性,但是直到我手动调用GC且内存达到60MB(这比应用程序加载时的内存小)之前,它没有什么区别。 我等待了34分钟,然后才手动按下GC按钮。
将完全混淆任何帮助,学习材料或最佳实践的方向。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。