Это звучит как возможный кандидат для рендеринга композиционной цели, попробуйте добавить это в свой конструктор MainWindow:
CompositionTarget.Rendering += CompositionTarget_Rendering;
А затем реализовать саму функцию:
void CompositionTarget_Rendering(object sender, EventArgs e)
{
// dispose previous image, create and assign the new one
}
Сделайте это правильнои он также должен обрабатывать случаи, когда ваша целевая машина не может поддерживать желаемую частоту кадров.
ОБНОВЛЕНИЕ: BitmapSource просто использует обычную память, поэтому правильное поведение состоит в том, чтобы GC мог ее очистить,Если этого не происходит в вашем случае, то это означает, что что-то удерживает эту память по какой-то причине, возможно, на дисплее.Вот пример, в котором используется CompositionTarget.Rendering. Я собираю дамп памяти GC как до, так и после сбора, чтобы вы могли видеть, что он достаточно четко собирается:
public MainWindow()
{
InitializeComponent();
CompositionTarget.Rendering += CompositionTarget_Rendering;
}
private void CompositionTarget_Rendering(object sender, EventArgs e)
{
// remove reference to old image
this.theImage.Source = null;
// invoke GC
Debug.WriteLine(GC.GetTotalMemory(false));
GC.Collect();
Debug.WriteLine(GC.GetTotalMemory(false));
// create and assign new image
const int width = 1000;
const int height = 1000;
var pixels = new uint[width * height];
uint color = (uint)((new Random((int)DateTime.Now.Ticks)).Next(0x1000000) | 0xff000000);
for (int i = 0; i < width * height; i++)
pixels[i] = color;
this.theImage.Source = BitmapSource.Create(width, height, 96, 96, PixelFormats.Bgra32, null, pixels, width * 4);
}