Мое приложение рушилось с исключениями из-за памяти, а иногда и другими исключениями, вероятно, также вызвано нехваткой памяти.
Я воспроизвел проблему с помощью этого простого кода:
for (int i = 0; i < 100000; i++)
var bmp = new RenderTargetBitmap(256, 256, 96, 96, PixelFormats.Default);
Теоретически этот код не должен падать, потому что битмапы должны автоматически собираться с мусором, но при сбое в 32-разрядном режиме он последовательно сработает.
Проблема может быть устранена следующим образом:
for (int i = 0; i < 100000; i++)
{
var bmp = new RenderTargetBitmap(256, 256, 96, 96, PixelFormats.Default);
if (i % 500 == 0)
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
Конечно, это решение противоречит общей мудрости, что вы не должны явно ссылаться на GC.Collect, но я подозреваю, что это сценарий, в котором он действительно имеет смысл.
Кто-нибудь может рассказать об этом? Есть ли лучший способ решить проблему?