В моей ситуации кажется, что проблема заключается в кэшировании растрового изображения. Ранее я загружал растровые изображения так:
Bitmap bitmap = new Bitmap();
using(var stream = new FileStream(...))
{
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = stream;
bitmap.EndInit();
}
bitmap.Freeze();
image.Source = bitmap;
Постоянная замена image.Source
тем же способом, что и при наращивании памяти, принудительное принудительное удаление мусора не помогло.
Вместо этого, отключение кэширования и использование его в потоке (требуется оставить поток открытым, пока изображение не отобразится) в сочетании с ручным сбором мусора исключило наращивание памяти для меня.
Stream mediaStream;
void DisposeMediaStream()
{
if (mediaStream != null)
{
mediaStream.Close();
mediaStream.Dispose();
mediaStream = null;
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
}
}
void Update()
{
DisposeMediaStream();
var bitmap = new BitmapImage();
mediaStream = new FileStream(...);
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.None;
bitmap.StreamSource = mediaStream;
bitmap.EndInit();
bitmap.Freeze();
ControlImage.Source = bitmap;
}
Таким образом, я могу циклически перемещаться по тоннам изображений (например, Windows Photo Viewer), и память остается низкой. Обратите внимание, что поток не должен оставаться открытым после того, как изображение действительно отрисовано.