簡體   English   中英

將Tiff幀加載到動態創建的Wpf圖像控件時,內存泄漏

[英]Memory leak when loading Tiff frames into dynamically created Wpf Image controls

在將tif幀加載到動態創建的Image控件中時,我有一個巨大的內存使用進度,這是邏輯,但當我刪除我的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);
    }
}

我相信我的控制卸載任務很糟糕,但我不知道如何以正確的方式做到這一點。 謝謝您的幫助。

我檢查了你的示例應用程序,我沒有看到任何內存泄漏。 我從這里使用了24bit lzw壓縮的tiff圖像。 按預期方式在垃圾收集后釋放對象。 我添加了一個第三個按鈕,使GarbageCollection不可避免地發生: GC.Collect();

這是結果: http//www.screencast.com/t/F5hhyTkAQ3e

添加圖像時,它們會添加到內存中。 單擊卸載時刪除對它們的任何引用,但這並不意味着垃圾收集將立即啟動。 對象放在大對象堆和垃圾收集中,沒有像第一代對象那樣快。 但是當GC完成時(例如,您可以在卸載后單擊添加,這可能會使GC更糟),對象將從內存中成功刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM