2011-04-21 79 views
3

我们的应用程序中存在一个问题,当用户控件 被卸载时内存未被释放。这将增加从40MB开始的内存,并以200MB或更多的内存结束。WPF不释放内存

为了模拟这一,

  1. 我创建具有主窗口和一个用户控制
  2. 装载1000个对象到被放置在用户控制
  3. 一种涡旋一个WPF数据网格一个WPF项目查看器放在主窗口中
  4. 用户控件在此滚动查看器中加载一旦点击显示按钮
  5. 用户控件从滚动viwer的内容中删除一次关闭按钮被点击

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

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

以下是我用于此的代码。我没有使用任何样式,数据模板或任何第三方控件,只使用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; 
    } 
} 

感谢。

回答

0

你为什么要调用GC?这不需要

变化

for (int i = 0; i < 1000; i++)   
{    
    TestClass obj = new TestClass(); 
    ... 

TestClass obj; 
for (int i = 0; i < 1000; i++)  
{   
    obj = new TestClass(); 
    ... 

您可以设置列表对象为空.. 阅读理解为对象设置为null Setting an object to null vs Dispose()

0

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

(仅限特例:致电GC.Collect()