Я отвечаю на мой вопрос, попробовав различные решения, и принимаю решение, данное пользователем 965487, потому что в конце он был прав (спасибо также Гансу Пассанту).
Если у вас есть класс (назовите его QV), похожий на этот
public class QV
{
Image img;
int pages;
public QV(filename) {
img = Bitmap.FromFile(filename);
pages = img.GetFrameCount(FrameDimension.Page);
}
~QV() {
img.Dispose();
img = null;
}
public Image GetPage(int page) {
if (page < 1 || page > pages) return null;
img.SelectActiveFrame(FrameDimension.Page, page - 1);
return new Bitmap(img);
}
}
тогда каждый раз, когда вы звоните GetPage(...)
, ваша память будет увеличиваться не только для размера возвращаемого изображения, но и для оператора img.SelectActiveFrame(...)
. Я не знаю почему и как, но это случается. Освобождение возвращенного изображения и вызов освобождают память для размера изображения, а не для суммы, взятой из SelectActiveFrame () (в любом случае эта память не дублируется, если вы вернетесь на предыдущую страницу).
Поэтому вам лучше каждый раз открывать и закрывать изображение, например:
public class QV
{
Image img;
int pages;
public QV(filename) {
img = Bitmap.FromFile(filename);
pages = img.GetFrameCount(FrameDimension.Page);
img.Dispose();
}
public Image GetPage(int page) {
if (page < 1 || page > pages) return null;
img = Bitmap.FromFile(filename);
img.SelectActiveFrame(FrameDimension.Page, page - 1);
Image ret = Bitmap(img);
img.Dispose();
return ret;
}
}
Полезная нагрузка для открытия и удаления изображения каждый раз, когда пользователь запрашивает новую страницу, на самом деле ничто по сравнению с опасным указанием памяти, выполненным с первым решением.
Надеюсь, кому-то это нужно.