У меня есть таймер, и на каждом тике я хочу взять файл изображения из памяти и изменить изображение, отображаемое в Image
, с помощью этого куска кода
Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Render,
new Action(() =>
{
ms.Seek(0, SeekOrigin.Begin);
e.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
bitmapImage.BeginInit();
bitmapImage.StreamSource = ms;
bitmapImage.CacheOption = BitmapCacheOption.None;
bitmapImage.EndInit();
CameraImageBox.BeginInit();
CameraImageBox.Source = bitmapImage;
CameraImageBox.EndInit();
bitmapImage = null;
ms.Flush();
}));
Элемент управления изображением становится черным как смоль после нескольких десятков изображений, и весь пользовательский интерфейс становится совершенно не отвечающим. Использование памяти переходит к колоссальному 1 гигабайту, я предполагаю, что кэш визуализации элементов управления изображениями не освобождается, поскольку e.Image
- это статический ресурс, который перерисовывается каждый раз.
Есть ли лучший способ сделать это, например, рендеринг изображения в Rectangle
или освобождение кеша вручную?