Мое приложение-образец получает экземпляр COM IStream
из функции IPortableDeviceResources::GetStream()
. Я хочу прочитать содержимое объекта устройства асинхронно, используя этот объект IStream. Как это сделать, используя асинхронный прозвище?Как читать потоки данных WPD MTP асинхронно?
ответ
IStream синхронно по дизайну. Сначала я спрошу, каков ваш сценарий для того, чтобы это было асинхронным.
Например, если причина для асинхронного потока данных заключается в том, что вы не будете блокировать поток пользовательского интерфейса, вы можете выполнять операции IStream в рабочем потоке.
Если причина в том, что вы можете выдавать несколько параллельных чтений, устройства MTP 1.0 не поддерживают это, потому что на уровне драйвера запросы будут по-прежнему обрабатываться последовательно в одном глобальном сеансе MTP. MTP 2.0 поддерживает многосеансовый сеанс, который позволяет использовать несколько параллельных подключений к одному и тому же устройству, но до сих пор не так много устройств приняли это. Большинство, если не все, MTP-устройств на рынке - MTP 1.0.
Благодарим за предоставление этих деталей. В настоящее время я читаю данные из объекта IStream в рабочем потоке. Я обеспокоен тем, что рабочий поток будет монополизирован при чтении большого файла на медленном устройстве. Если я могу использовать асинхронные прозвища для чтения данных IStream, тогда я могу прервать чтение, когда это необходимо, а также позволить другим задачам запускаться, пока ОС отправляет чтение на основное MTP-устройство. Но я не уверен, могу ли я использовать асинхронные прозвища здесь? – user2059733
Передачи MTP через Windows WPD API выполняются в блоках, вы читаете с устройства IStream, записываете в свою память/файл, а затем в цикл. После каждого чтения проверяйте синхронизированный флаг перед циклом. –