Почему обёртка DownloadAsync не передавала события прогресса

В приложении из разбора Рэймонда Чена загрузка выполнялась, но обработчик прогресса не вызывался. Клиент подписывался на IAsyncOperationWithProgress, возвращённую методом AggregateSource::DownloadAsync, но не получал уведомлений.

Где оборвалась передача

Проблема заключалась в том, что метод выбирал провайдера, ожидал его DownloadAsync и возвращал итоговое значение. Полученная таким образом внешняя операция не была автоматически связана с внутренней: внутренней операции не передавался токен прогресса через winrt::get_progress_token(), поэтому она не сообщала значения подписчику. Иными словами, прогресс внутренней операции сам по себе не переходил через эту обёртку.

Как выбрать решение

Если поиск провайдера выполняется синхронно, простым и корректным решением является вернуть клиенту напрямую операцию провайдера — тогда подписка попадёт к реальному источнику уведомлений и прогресс будет доходить до обработчика.

Если требуется именно внешняя обёртка операции, передача прогресса должна быть выполнена явно: внешняя операция должна принимать и пробрасывать токен прогресса в внутрь или вручную публиковать обновления прогресса, получаемые от провайдера. При отладке важно проверить всю цепочку: кто создаёт операцию, к какому объекту подключён callback и кто публикует значения. Само объявление типа с поддержкой прогресса не создаёт события автоматически.