Reputation: 9901
My WPF UI is keeping all of the images I use in memory. Below is the relevant retention graph. Using the ANTS Memory Profiler 8.7, I have established that none of my code is holding onto any these objects. I have written code so that multiple request for the same image create only one image, but that leaves me with the problem that there are enough images within my application to crash it when they are all loaded simultaneously. I turned off this code when I ran this memory profile. I need to flush these images. I have even resorted to manually calling GC.Collect
which did not reduce the memory used. Something is holding these images and it is not my code.
Here is the code for how I expose the BitmapImage
to then be bound to Image.Source
. This does not contain my image-to-path dictionary caching service that is now turned off.
public BitmapImage Image
{
get
{
var image = new BitmapImage();
image.BeginInit();
image.UriSource = a_url;
image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
image.EndInit();
image.Freeze();
return image;
}
}
// The XAML
<Image Source="{Binding Image, Mode=OneWay}"/>
NOT A DUPLICATE
I have determined that the BitmapImage
is being held on to and have explicitly invoked GC.Collect
which did nothing. The problem is not the GC. I also always Freeze
my BitmapImage
objects when I create them in code. This is not my first time around.
Upvotes: 3
Views: 831
Reputation: 10744
I can see from the object graph that you have a class called ImageAnimationController
, which is holding a reference to the Image control that uses your BitmapImage as its source by a DependencyPropertyDescriptor
. The ImageAnimationController
uses the DependencyPropertyDescriptor
to subscribe to change notifications of the Image
control's Source
DependencyProperty
. When the ImageAnimationController
class is disposed it will unsubscribe from the DependencyPropertyDescriptor
notifications.
It looks like this ImageAnimationController
class is a component of an open source library called WPF Animated GIF. I can't see how you are using this library as you have not included the source, but I imagine that somewhere you have either something like this:
ImageBehavior.SetAnimatedSource(img, image);
Or this:
<Image gif:ImageBehavior.AnimatedSource="{Binding Image}" />
I am not familiar with this library or your code, but I imagine that you will need to ensure that this attached behaviour is correctly detached and disposed of.
Upvotes: 1