Я работаю в Atalasoft, но я не знаю WPF или даже почти ничего о DotTwain!
Я могу вам сказать, что обычно сканирование TWAIN может выполняться в отдельном потоке сканирования, но вы должныпозаботься.Самый простой подход состоит в том, чтобы выполнять все операции TWAIN в потоке сканирования - не смешивайте вызовы TWAIN между двумя потоками.
Поток сканирования должен иметь поток сообщений или быть потоком пользовательского интерфейса, что бы это ни занималов вашей среде.Это не просто рабочий поток.
TWAIN ожидает, что ему будет предоставлен дескриптор окна (старомодный Win32 HWND) для использования в качестве родительского окна для пользовательского интерфейса сканера.Для этой цели я рекомендую создать окно «родительское сканирование» в потоке сканирования.Вы можете сделать его видимым или нет по своему усмотрению и уничтожить его в конце задания на сканирование.
Если задания на сканирование могут быть очень большими (например, 50 страниц с разрешением 400 точек на дюйм), вы должны убедиться, чтопроцесс сканирования не заполняет ни логическую память, ни оперативную память.Если вы заполняете логическую память (32-битный процесс Windows получает около 2 ГБ адресного пространства для работы), выделения не будут выполнены.Если вы заполняете ОЗУ, код, который потребляет / утилизирует входящие изображения, может начать меняться, радикально замедляясь, затем сканирование выполняется и заполняется логическая память.Поэтому вам необходимо либо:
- полностью обработать и утилизировать каждое входящее изображение в потоке сканирования, либо
- уменьшить поток изображений из потока сканирования, чтобы он не мог зайти слишком далекоперед их обработкой / удалением.
Я обычно нахожу, что хочу иметь возможность отменить поток сканирования, что требует некоторого терпения, так как вызовы TWAIN не могут быть прерваны, а некоторые из них тяжелы.Как вы заметили с вашим каноном.С другой стороны, если вы принудительно уничтожите поток внутри вызова TWAIN, сканеру может потребоваться цикл питания или даже перезагрузка системы, и сам TWAIN будет блокироваться до тех пор, пока DLL-библиотека менеджера TWAIN не будет выгружена из памяти и загружена повторно.Обычно лучше всего вежливо отключить TWAIN.