Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Tiff帧加载到动态创建的Wpf图像控件时内存泄漏_C#_Wpf_Memory Leaks_Frame_Tiff - Fatal编程技术网

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

C# 将Tiff帧加载到动态创建的Wpf图像控件时内存泄漏,c#,wpf,memory-leaks,frame,tiff,C#,Wpf,Memory Leaks,Frame,Tiff,在将tif帧加载到动态创建的图像控件时,我有一个巨大的内存使用进度,这是逻辑, 但当我移除图像控件时,使用的内存不会卸载!这就是我不明白的。 以下是我的测试代码: XAML: 贝欣德代码: private void OnLoadClck(object sender, RoutedEventArgs e) { TiffBitmapDecoder tbd = new TiffBitmapDecoder(new Uri("d:\\test.tif"), BitmapCreateOption

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


贝欣德代码:

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);
    }
}
private void OnLoadClck(对象发送方,RoutedEventArgs e)
{
TiffBitmapDecoder tbd=新的TiffBitmapDecoder(新Uri(“d:\\test.tif”)、BitmapCreateOptions.DelayCreation、BitmapCacheOption.OnDemand);
对于(int i=0;i0)
{
图像img=panel.Children[0]作为图像;
img.Source=null;
面板。儿童。移除(img);
}
}
我相信我的控制卸载任务正在恶化,但我不知道如何以正确的方式进行。
谢谢您的帮助。

我已经检查了您的示例应用程序,没有发现任何内存泄漏。我使用了来自的24位lzw压缩tiff图像。对象按预期在垃圾收集后释放。我添加了第三个按钮,用于立即执行垃圾收集:
GC.Collect()

结果如下:

当您添加图像时,它们将被添加到内存中。当您单击unload时,您将删除对它们的任何引用,但这并不意味着垃圾收集将立即开始。对象被放在大型对象堆中,垃圾收集的速度不如第一代对象快。
但是,当GC完成时(例如,您可以在卸载后单击add,这可能是为了GC),对象将成功地从内存中删除。

我已经检查了您的示例应用程序,没有发现任何内存泄漏。我使用了来自的24位lzw压缩tiff图像。对象按预期在垃圾收集后释放。我添加了第三个按钮,用于立即执行垃圾收集:
GC.Collect()

结果如下:

当您添加图像时,它们将被添加到内存中。当您单击unload时,您将删除对它们的任何引用,但这并不意味着垃圾收集将立即开始。对象被放在大型对象堆中,垃圾收集的速度不如第一代对象快。
但是,当GC完成时(例如,您可以在卸载后单击add,这可能是为了GC),对象将成功地从内存中删除。

考虑使用带有水平StackPanel的ItemsControl作为ItemsPanel。将其ItemsSource属性绑定到包含位图帧的
ObservableCollection
。使用
创建一个ItemTemplate。这只是一个测试应用程序。请尝试使用
BitmapCreateOptions.None
BitmapCacheOption.OnLoad
从文件流(而不是Uri)创建TiffBitmapDecoder。在检索Frames集合后立即处理流。除了Clemens的建议之外,还应该对BitmapFrame对象调用Freeze()方法。在某些情况下,使用unFROSEN可冻结对象也会导致内存泄漏。@帕维尔好点,但是在框架集合中的BITMAPFrAMS实例在使用BitmapCacheOption.OnLoad.Consider加载文件流时,已经被冻结了,使用ItSeStand控件作为一个ItSAMPEL进行水平堆栈面板。将其ItemsSource属性绑定到包含位图帧的
ObservableCollection
。使用
创建一个ItemTemplate。这只是一个测试应用程序。请尝试使用
BitmapCreateOptions.None
BitmapCacheOption.OnLoad
从文件流(而不是Uri)创建TiffBitmapDecoder。在检索Frames集合后立即处理流。除了Clemens的建议之外,还应该对BitmapFrame对象调用Freeze()方法。在某些情况下,使用Unforsen freezable对象也可能导致内存泄漏。@Pavel说得很好,但是当使用BitmapCacheOption.OnLoad从文件流加载时,Frames集合中的BitmapFrame实例肯定已经冻结。实际上,GC.Collect()做了一些改进。如果我不想删除我的IMAGE控件,该怎么办?我只想卸载源代码,您不应该在生产代码中调用GC.Collect。我把它放在那里只是为了证明没有内存泄漏。强制GC会显著降低性能。您所要做的就是确保没有对象保存对图像的引用。不确定您的意思是什么,但不删除图像控件?您不想继续显示图像,但不想将其加载到内存中?好吧,这是不可能的,要让它们显示在屏幕上,它们必须加载到内存中。我的目标是模拟tiff文件的缩略图查看器,以便卸载用户看不到的图像确实,GC.Collect()做了一些改进。如果我不想删除我的IMAGE控件,该怎么办?我只想卸载源代码,您不应该在生产代码中调用GC.Collect。我把它放在那里只是为了证明没有内存泄漏。强制GC会显著降低性能。您所要做的就是确保没有对象保存对图像的引用。不确定您的意思是什么,但不删除图像控件?您不想继续显示图像,但不想将其加载到内存中?嗯,这是不可能的,要在屏幕上显示它们,必须将它们加载到内存中。我的目标是模拟tiff文件的缩略图查看器,以便卸载用户看不到的图像
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);
    }
}