将Tiff帧加载到动态创建的Wpf图像控件时,内存泄漏

时间:2017-03-14 10:47:54

标签: c# wpf memory-leaks frame tiff

在将tif帧加载到动态创建的Image控件中时,我有一个巨大的内存使用进度,这是逻辑, 但是当我删除我的图像控件时,使用的内存不会卸载!这就是我不明白的地方。 这是我的测试代码: XAML:

<Grid>
    <Button Content="Load" Margin="0,0,582,280" Click="OnLoadClck"/>
    <ScrollViewer Margin="10,54,0,0" HorizontalScrollBarVisibility="Visible">
        <StackPanel Orientation="Horizontal" x:Name="panel">

        </StackPanel>
    </ScrollViewer>
    <Button Content="Unload" Margin="147,0,435,280" Click="OnUnloadClick"/>
</Grid>

代码behinde:

private void OnLoadClck(object sender, RoutedEventArgs e)
{
    TiffBitmapDecoder tbd = new TiffBitmapDecoder(new Uri("d:\\test.tif"), BitmapCreateOptions.DelayCreation, BitmapCacheOption.OnDemand);
    for (int i = 0; i < tbd.Frames.Count; i++)
    {
        var f = tbd.Frames[i];

        Image img = new Image{Width=100, Height=150 };
        img.Source = f;

        panel.Children.Add(img);
    }

}

private void OnUnloadClick(object sender, RoutedEventArgs e)
{
    while(panel.Children.Count>0)
    {
        Image img = panel.Children[0] as Image;
        img.Source = null;
        panel.Children.Remove(img);
    }
}

我相信我的控制卸载任务很糟糕,但我不知道如何以正确的方式做到这一点。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我已经检查了您的示例应用程序,但我没有看到任何内存泄漏。我使用了来自here的24位lzw压缩tiff图像。按预期方式在垃圾收集后释放对象。我已经添加了第三个按钮,使GarbageCollection不可避免地发生:GC.Collect();

结果如下:http://www.screencast.com/t/F5hhyTkAQ3e

添加图像时,会将它们添加到内存中。当您单击卸载时,删除对它们的任何引用,但这并不意味着垃圾收集将立即启动。对象放在大对象堆和垃圾收集中,没有像第一代对象那样快。 但是当GC完成时(例如,你可以在卸载后点击添加,这可能会使GC更糟),对象就会从内存中成功删除。