WPF图像控制内存泄漏

Cra*_*ker 5 c# wpf memory-leaks

我的程序有很多小图像(图像控件很小,而不是图像本身),并说了很多我的意思是超过500.这些图像是异步生成的,然后分配给Image之前初始化的控件.
基本上我的代码执行以下操作:

            filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, string.Format("{0}.JPG", Guid.NewGuid().GetHashCode().ToString("x2")));
            converter.ConvertPdfPageToImage(filename, i);
            //Fire the ThumbnailCreated event
            onThumbnailCreated(filename, (i - 1));  
Run Code Online (Sandbox Code Playgroud)

在创建图像的代码中没有内存泄漏,我有以下代码:

            string[] files = Directory.GetFiles("C:\\Users\\Daniel\\Pictures", "*.jpg");
            for(int i=0; i<files.Length; i++){
                onThumbnailCreated(files[i], i);
            } 
Run Code Online (Sandbox Code Playgroud)

问题仍然存在.这发生在事件处理程序方法中:

    void Thumbnails_ThumbnailCreated(ThumbnailCreatedEventArgs e, object sender)
    {
        //Since we generate the images async, we need to use Invoke
        this.parent.Dispatcher.Invoke(new SetImageDelegate(SetImage), e.Filename, e.PageNumber);
    }

    private void SetImage(string filename, int pageNumber)
    {
        BitmapImage bitmap = new BitmapImage();
        bitmap.BeginInit();
        //I am trying to make the Image control use as less memory as possible
        //so I prevent caching
        bitmap.CacheOption = BitmapCacheOption.None;
        bitmap.UriSource = new Uri(filename);
        bitmap.EndInit();
        //We set the bitmap as the source for the Image control
        //and show it to the user
        this.images[pageNumber].Source = bitmap;
    }
Run Code Online (Sandbox Code Playgroud)

有468个图像,程序使用大约1Gb的内存,然后根本就用完了.我的任务甚至可以实现使用WPF还是图像数量太高?也许我的代码出了问题?
提前致谢

Ben*_*ker -4

尝试这个:

private void SetImage(string filename, int pageNumber)
{
    using (BitmapImage bitmap = new BitmapImage())
    {
        bitmap.BeginInit();
        //I am trying to make the Image control use as less memory as possible
        //so I prevent caching
        bitmap.CacheOption = BitmapCacheOption.None;
        bitmap.UriSource = new Uri(filename);
        bitmap.EndInit();
        this.images[pageNumber].Source = bitmap;
    }
}
Run Code Online (Sandbox Code Playgroud)

当您使用完位图后,这将处理它们。

  • 显然他正在使用位图,因为他将其分配给“images”。调用“Dispose”确实可能有帮助,但肯定不会在您放置它的位置。 (3认同)