Я думаю, что ваша проблема в том, что если вы загружаете слишком много изображений одновременно в цикле в тот момент, когда вы выходите из цикла и возвращаете фокус на поток пользовательского интерфейса, то вся сборка мусора на растровых изображениях завершена.
Эта статья объясняет это немного лучше и предлагает решение.
У меня тоже была эта проблема, и я нашел собственное решение. У меня был dictonairy с URL-адресом изображения, который нужно было загрузить, но вы можете легко изменить это для своего сценария.
Этот вопрос SO также касается этой проблемы (загрузка нескольких изображений и сбой (исключение)). У него также есть ответ от Microsoft, я основал свое решение на их ответе.
В моем решении я использую диспетчер, чтобы вернуться к потоку пользовательского интерфейса и, таким образом, убедиться, что мусор использованного изображения и растровых изображений был очищен.
private void LoadImages(List<string> sources)
{
List<string>.Enumerator iterator = sources.GetEnumerator();
this.Dispatcher.BeginInvoke(() => { LoadImage(iterator); });
}
private void LoadImage(List<string>.Enumerator iterator)
{
if (iterator.MoveNext())
{
//TODO: Load the image from iterator.Current
//Now load the next image
this.Dispatcher.BeginInvoke(() => { LoadImage(iterator); });
}
else
{
//Done loading images
}
}