Так что я получил это Еогеасп цикл здесьНе удается получить .Dispose() для работы в цикле Еогеаспа
foreach (string file in condensedFilesList)
{
Image imgToAdd;
imgToAdd = Image.FromFile(file);
if (imgToAdd.Width < 1920 || imgToAdd.Height < 1080)
{
//neither of the commented out lines worked when placed here
//imgToAdd = null;
//imgToAdd.Dispose();
condensedFilesList.Remove(file);
}
else
{
//neither of the commented out lines worked when placed here
//imgToAdd = null;
//imgToAdd.Dispose();
continue;
}
}
Он содержит список путей файлов, указывающих .jpg изображений. Около 80 из них разных размеров. Мне нужен список для просмотра каждого изображения, проверьте, разрешено ли его разрешение 1920 * 1080, а если нет, удалите указатель пути к нему из массива.
В настоящий момент это происходит, установив изображение для просмотра в переменной imgToAdd, а затем, если свойство width или height не соответствует этому элементу, его нужно удалить. Это работает для первой записи. Это разрешение не соответствует законопроекту, и мой массив упадет с 80 до 79 записей.
Но я не могу заставить мою переменную imgToAdd пустым, поэтому я могу назначить ей новый файлPath. Я продолжаю работать в OutOfMemoryException. Я попытался запустить .Dispose(), установив его равным нулю, и я не могу заставить его фактически освободить себя от своих ресурсов.
В отладчике .Dispose() заставляет imgToAdd иметь длинный список ошибок вместо значений при проверке элемента. Все его свойства есть, но бесполезны и заменены ошибками. Если я установил значение = null, он будет работать, а на следующей итерации imgToAdd = null. Buuuuut, я все еще получаю OutOfMemoryException, когда он пытается назначить новую переменную filePath.
Так что я понятия не имею, что с этим. Я надеюсь, что кто-то другой может указать, что я делаю неправильно, я не вижу этого.
EDIT2:
Я просто хочу, чтобы перезаписать это редактировать пространство, если люди хотят, чтобы проверить эволюцию функции, как я обновить, ударяет историю редактирования. Я попытался использовать инструкцию using() {}, например, @dlatikay, и записать ее в новый список. Но, к сожалению, я все еще получаю исключение OutOfMemoryException. Вот функция правой
var tempList = new List<string>();
foreach (string file in condensedFilesList)
{
using (Image imgToAdd = Image.FromFile(file))
{
if (imgToAdd.Width < 1920 || imgToAdd.Height < 1080)
{
continue;
}
else
{
tempList.Add(file);
}
}
}
condensedFilesList = tempList;
вызов перед тем, как сделать это = null –
I.e .. imgToAdd.Dispose(); затем imgToAdd = null; –
FYI Вы не можете изменить коллекцию, которую вы итерируете. Вам нужно либо создать временную коллекцию для итерации, либо вам нужно сделать цикл 'for', который начинается в конце и работает в начале списка. – juharr