如何在Silverlight / WPF上释放RAM?

时间:2012-01-16 07:07:54

标签: wpf silverlight

如何在Silverlight / WPF上释放RAM?我定义了一个UserControl MyUC,它有一个Image和三个Textblock。我将10000个MyUC添加到网格中,然后清除Grid的子项,但RAM不会被释放!为什么? MyUC:

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="32"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Image Grid.Column="0" Source="{Binding ICO}" Width="32" Height="32"/>
    <StackPanel Grid.Column="1" Orientation="Vertical" Width="359" Margin="0,0,-189,0">
        <TextBlock Text="{Binding ID}"/>
        <TextBlock Text="{Binding Name}"/>
        <TextBlock Text="{Binding URL}"/>
    </StackPanel>
</Grid>

代码:

MyUC uc = null;
for (int i = 0; i < 10000; i++)
{
  uc = new MyUC();
  this.LayoutRoot.Children.Clear();
  this.LayoutRoot.Children.Add(uc);
}

帮帮我? 3KS!

1 个答案:

答案 0 :(得分:0)

简短的回答是,在您提供的情况下,您不会做任何明确的释放内存的事情。

当您的MyUC类的每个实例超出范围时,垃圾收集器将确定它不再可访问。在下一次垃圾收集时,无法访问的实例将被“标记”,内存将被压缩。这对于.NET如何工作至关重要。

您的测量内存诊断是否正在检测垃圾收集的影响是另一回事,您没有提供有关您正在使用的诊断的任何信息。

Microsoft .NET公共语言运行时环境中的垃圾收集完全免除了开发人员跟踪内存使用情况并知道何时释放内存。但是,您需要了解它的工作原理。这篇由两部分组成的关于.NET垃圾收集的文章的第1部分

资料来源:Jeffery Richter Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework