2013-02-10 7 views
0

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

ответ

0

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

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

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

+0

Благодарим за предоставление этих деталей. В настоящее время я читаю данные из объекта IStream в рабочем потоке. Я обеспокоен тем, что рабочий поток будет монополизирован при чтении большого файла на медленном устройстве. Если я могу использовать асинхронные прозвища для чтения данных IStream, тогда я могу прервать чтение, когда это необходимо, а также позволить другим задачам запускаться, пока ОС отправляет чтение на основное MTP-устройство. Но я не уверен, могу ли я использовать асинхронные прозвища здесь? – user2059733

+0

Передачи MTP через Windows WPD API выполняются в блоках, вы читаете с устройства IStream, записываете в свою память/файл, а затем в цикл. После каждого чтения проверяйте синхронизированный флаг перед циклом. –