Как асинхронно читать поток данных WPD MTP?

Мое примерное приложение получает экземпляр COM IStream из функции IPortableDeviceResources::GetStream(). Я хочу асинхронно прочитать содержимое объекта устройства, используя этот объект IStream. Как я могу сделать это, используя асинхронный моникер?


person user2059733    schedule 10.02.2013    source источник


Ответы (1)


IStream является синхронным по замыслу. Я бы сначала спросил, каков ваш сценарий для того, чтобы это было асинхронным.

Например, если вам нужен асинхронный поток данных, чтобы не блокировать поток пользовательского интерфейса, вы можете выполнять операции IStream в рабочем потоке.

Если причина в том, что вы можете выполнять несколько параллельных операций чтения, устройства MTP 1.0 не поддерживают это, поскольку на уровне драйвера запросы все равно будут обрабатываться последовательно в одном глобальном сеансе MTP. MTP 2.0 поддерживает многосеансовый режим, который допускает несколько параллельных подключений к одному и тому же устройству, но пока это реализовано не на многих устройствах. Большинство, если не все, MTP-устройства на рынке — это MTP 1.0.

person Lisa O    schedule 11.02.2013
comment
Спасибо, что предоставили эти данные. В настоящее время я читаю данные из объекта IStream в рабочем потоке. Меня беспокоит, что рабочий поток будет монополизирован при чтении большого файла на медленном устройстве. Если я могу использовать асинхронные моникеры для чтения данных IStream, то я могу прервать чтение, когда это необходимо, а также разрешить выполнение других задач, пока ОС отправляет чтение на базовое устройство MTP. Но я не уверен, могу ли я использовать здесь асинхронные моникеры? - person user2059733; 19.02.2013
comment
Передача MTP через Windows WPD API выполняется блоками, вы читаете с устройства IStream, записываете в свою память/файл, а затем выполняете цикл. После каждого чтения проверяйте синхронизированный флаг перед циклом. - person Jason Harrison; 01.11.2015