ответ Kyle довольно хорош. Я думаю, что единственное дополнительное разъяснение состоит в том, что закрытие является в основном снимком стека в точке, что функция лямбды создается. Тогда, когда функция повторно выполняется, стек восстанавливается тому состоянию прежде, чем выполнить функцию. Таким образом как Kyle упоминает, то скрытое значение (count
) доступно, когда функция лямбды выполняется.
Стоит знать, что OutOfMemoryException не всегда на самом деле означает, что не хватает памяти - особенно при работе с файлами. Я считаю, что это также может произойти, если по какой-то причине у вас закончились ручки.
Вы удаляете все свои растровые изображения после того, как закончите с ними? Повторяется ли это для одного изображения?
Если это не плохой файл изображения, а на самом деле обычная проблема с Image.FromFile
при этом дескрипторы файлов остаются открытыми, тогда решение заключается в использовании вместо этого Image.FromStream
.
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
using (Image original = Image.FromStream(fs))
{
...
Использование явного Dispose ()
, оператора using ()
или установка значения null
в битовой карте не решает проблему с Image.FromFile
.
Итак, если у вас приложение работает какое-то время и открывает много файлов, подумайте об использовании вместо него Image.FromStream ()
.
Также вы можете открыть его в режиме чтения (если вы хотите использовать его в двух местах одновременно)
public Image OpenImage(string previewFile)
{
FileStream fs = new FileStream(previewFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
return Image.FromStream(fs);
}