如何释放ListView的源内存?

时间:2018-07-10 03:16:52

标签: c# wpf memory-leaks .net-4.5

我想立即释放ListView的ItemsSource参考,以防该参考拥有大量内存。

但是,即使我的代码中没有任何引用,GC也不会释放该引用。例如,我希望通过下面的“免费”按钮释放/orders

SimpleListView.xaml

byte[]

SimpleListView.xaml.cs

<Window x:Class="PlayWPF.SimpleListView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SimpleListView" Height="450" Width="800">
  <DockPanel LastChildFill="True">
    <ListView Name="LvTest" Width="500" DockPanel.Dock="Left"/>
    <Button Content="Alloc" Click="AllocClick" Height="200" DockPanel.Dock="Top"/>
    <Button Content="Free" Click="FreeClick"/>
  </DockPanel>
</Window>

单击“免费”按钮没有任何区别,对于public partial class SimpleListView : Window { public SimpleListView() { InitializeComponent(); } private void AllocClick(object sender, RoutedEventArgs e) { var list = new List<byte[]>(); list.Add(new byte[100000000]); LvTest.ItemsSource = list; } private void FreeClick(object sender, RoutedEventArgs e) { LvTest.ItemsSource = null; //LvTest.ItemsSource = new List<int>(); GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); GC.WaitForPendingFinalizers(); } } ,它将在第二次试用时释放参考。即使我关闭窗口,参考也仍然有效。

我该如何释放它?

编辑:它已标记为Why Large Object Heap and why do we care?的可能重复项,但是在.NET 4.7.1上更改new List<int>()无效。

我找到了解决方案,使用了LargeObjectHeapCompactionMode而不是普通的ObservableCollection,它回答了原始问题,但是我不知道如何以及为什么这会有所不同。出于好奇,我将这个问题保留。

1 个答案:

答案 0 :(得分:0)

在当前已删除的blog post上进行了描述。

  

TextBlock控件绑定到对象(myGrid),该对象具有对TextBlock的引用(这是myGrid子级的子对象之一)。
    请注意,这种类型的DataBinding泄漏对于kb文章中记录的特定方案(并非所有DataBinding方案)是唯一的。路径中的属性不是DependencyProperty,也不是在实现INotifyPropertyChanged的类上,此外,还必须存在一连串的崇高敬意。

因此,我滥用了数据绑定,下面是正确的免费代码段。

BindingOperations.ClearBinding(MyTextBlock, TextBlock.TextProperty);