gpt4 book ai didi

WPF不释放内存

转载 作者:行者123 更新时间:2023-12-04 02:39:27 25 4
gpt4 key购买 nike

我在我们的应用程序中遇到一个问题,当用户控制时内存没有释放被卸载。这将从 40MB 开始增加内存,最终增加到 200MB 甚至更多。

为了模拟这个,

  1. 我创建了一个包含主窗口和用户控件的 wpf 项目
  2. 将 1000 个对象加载到放置在用户控件中的 wpf 数据网格中
  3. 在主窗口中放置了一个滚动查看器
  4. 单击显示按钮后,用户控件将加载到此滚动查看器中
  5. 单击“关闭”按钮后,用户控件将从 ScrollView 的内容中删除

我用任务管理器检查过,在将 1000 个对象加载到网格之前,内存消耗为 14MB。单击显示按钮加载后,它会增加到 70MB。但是当我单击关闭按钮从窗口中删除用户控件时,内存仅减少到 67MB。它不应该减少到 14BMB 或接近那个值吗??

当我用 ANTS 内存分析器检查它时,它显示即使在用户控件从窗口中删除后,1000 个对象仍保留在内存中。当用户控件从窗口中移除时(一旦滚动查看器的内容属性设置为 null),垃圾收集器不应该释放这些对象吗?

以下是我为此使用的代码。我没有使用任何样式、数据模板或任何第三方控件,仅使用 WPF DataGrid 控件加载数据。

背后的用户控制代码

public partial class UserControl1 : UserControl,IDisposable
{
List<TestClass> list = null;

public UserControl1()
{
InitializeComponent();
}

public void Dispose()
{
BindingOperations.ClearBinding(dgList, DataGrid.ItemsSourceProperty);
list.Clear();
GC.Collect();
}

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
list = new List<TestClass>();

for (int i = 0; i < 1000; i++)
{
TestClass obj = new TestClass();
obj.Name = "test name";
obj.Age = 34;

list.Add(obj);
}
dgList.ItemsSource = list;
}

}

public class TestClass
{
public string Name { get; set; }
public int Age { get; set; }
}

主窗口代码隐藏

public partial class MainWindow : Window
{
UserControl1 control = null;

public MainWindow()
{
InitializeComponent();
}

private void btnClose_Click(object sender, RoutedEventArgs e)
{
control.Dispose();
scwContent.Content = null;
control = null;

}

private void btnShow_Click(object sender, RoutedEventArgs e)
{
control = new UserControl1();
scwContent.Content = control;
}
}

谢谢。

最佳答案

垃圾收集器仅在需要内存时收集,而不是在引用设置为空时收集。

(唯一的异常(exception):调用 GC.Collect())

关于WPF不释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5739709/

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