This project has moved. For the latest updates, please go here.

Вопрос про освобождении памяти

Nov 18, 2016 at 11:06 AM
Edited Nov 18, 2016 at 12:38 PM
ДОбрый день.
Есть такой вопрос - в конце работы со сканером, те когда вызываешь CloseDataSource CloseDSM() , память под картинки отсканированые освобождается?
И когда делаешь tw.GetImage(number) - возвращается Bitmap его тоже нужно самому освобождать или нет?

Просто у меня после завершения сканирования съедается 100 мб памяти
Coordinator
Nov 18, 2016 at 12:38 PM
Edited Nov 19, 2016 at 8:15 AM
Добрый день, Aleksey1555.
При вызове CloseDataSource CloseDSM() , память под картинки отсканированые НЕ освобождается.
При скарировании в режиме Native (по умолчанию) полученные данные хранятся в виде массива байт и преобразуются в изображение при вызове метода tw.GetImage(number) (или Twain32.EndXferEventArgs.Image из события Twain32.EndXfer). При повторном запросе изображения будет возвращена ссылка на тот же экземпляр, что и в первый раз (т.е. изображение повторно создаваться не будет).
Соответственно, возвращаемый Bitmap нужно самому освобождать.
Внутренняя коллекция данных очищается только перед началом следующего сканирования.
Marked as answer by SARAFF on 11/25/2016 at 11:13 AM
Nov 21, 2016 at 5:48 AM
Edited Nov 21, 2016 at 6:06 AM
а хранится картинка в каком формате? BMP?
Этот байт массив под каждую картинку освобождается или мне его надо освобождать?
Заметил что после сканирования память не освобождается.
Т.е. я создал объект Twain32 потом вызвал OpenDSM,OpenDataSource все отсканировал и вызвал CloseDataSource и CloseDSM . Дальше объект Twain32 разрушается ( выход из функции) а память не (в taskmgr) не освобождается и если вызвать сканирование по новой (т.е. создать объект Twain32 и вызвать все методы - OpenDataSource OpenDSM Aquire CloseDataSource Close DSM ) то память начинает накапливаться. Т,е. память не освобождается.
Что не так?
Coordinator
Nov 21, 2016 at 7:25 AM
Добрый день, Aleksey1555.
Как-то запутано у Вас вышло. Вам надо освобождать только изображения, которые Вы получили, т.е., например:
private void _twain32_EndXfer(object sender,Twain32.EndXferEventArgs e) {
    try {
        using(var _image = e.Image) {
            _image.Save("filename.tif",ImageFormat.Tiff);
        }
   } catch(Exception ex) {
        MessageBox.Show(ex.Message,ex.GetType().Name,MessageBoxButtons.OK,MessageBoxIcon.Error);
    }
}
или
private void _twain32_AcquireCompleted(object sender,EventArgs e) {
    try {
        for(int i=0; i<this._twain32.ImageCount; i++) {
            using(var _image=this._twain32.GetImage(i)){
                _image.Save(Path.GetTempFileName());
            }
        }
    } catch(Exception ex) {
        MessageBox.Show(ex.Message,ex.GetType().Name,MessageBoxButtons.OK,MessageBoxIcon.Error);
    }
}
Если Вы их не будите извлекать, то и освобождать их не надо.
Все остальное само освободится в нужный момент времени.
Экземляр Twain32 не разрушается при вызове CloseDSM. Он разрушается при вызове Dispose и последующей сборке мусора.
Nov 21, 2016 at 12:48 PM
так делать Dispose для Twain32 объекта ?
Coordinator
Nov 21, 2016 at 2:45 PM
Конечно делать.
P.S. Если Twain32 лежит в контейнере, Dispose контейнера автоматически вызовет Twain32.Dispose.
Nov 22, 2016 at 6:37 AM
Edited Nov 22, 2016 at 6:45 AM
Dispose - не помог
Пробую так
  1. Создаю Twain32
  2. Вызываю все SeectSource и OpenSource
  3. Выставляю Capabilities
    4.в цикле перебираю все картинки tw.GetImage(i) и для каждой вызываю Dispose т.е. так:
    for(int i=0;i<tw.ImageCount;i++) (tw.GetImage(i)).Dispose()
  4. tw.CloseDataSource();
    tw.CloseDSM();
    tw.Dispose();
Делаю так и в процессе сканирования память увеличивается а после окончания сканирования вызываю CloseDataSource Close DSM Dispose и
все равно память не освобождается. И если начать сканировать по новой (те опять создать объект Twain32 и пройти полный цикл) то память увеличивается дальше.
Такое ощущение что то что сканируется от раза к разу остается и не освобождается.
Так как освободить память?Пожалуйста скажите, очень важно
Coordinator
Nov 22, 2016 at 6:04 PM
Добрый день, Aleksey1555.
Я воспроизвел Ваш алгоритм в следующем примере. В примере было отсканировано 500 страниц, утечки памяти не выявлено.
Nov 23, 2016 at 8:23 AM
ООО, спасибо большое