В приложении из разбора Рэймонда Чена загрузка выполнялась, но обработчик прогресса не вызывался. Клиент подписывался на IAsyncOperationWithProgress, возвращённую методом AggregateSource::DownloadAsync, но не получал уведомлений.
Где оборвалась передача
Проблема заключалась в том, что метод выбирал провайдера, ожидал его DownloadAsync и возвращал итоговое значение. Полученная таким образом внешняя операция не была автоматически связана с внутренней: внутренней операции не передавался токен прогресса через winrt::get_progress_token(), поэтому она не сообщала значения подписчику. Иными словами, прогресс внутренней операции сам по себе не переходил через эту обёртку.
Как выбрать решение
Если поиск провайдера выполняется синхронно, простым и корректным решением является вернуть клиенту напрямую операцию провайдера — тогда подписка попадёт к реальному источнику уведомлений и прогресс будет доходить до обработчика.
Если требуется именно внешняя обёртка операции, передача прогресса должна быть выполнена явно: внешняя операция должна принимать и пробрасывать токен прогресса в внутрь или вручную публиковать обновления прогресса, получаемые от провайдера. При отладке важно проверить всю цепочку: кто создаёт операцию, к какому объекту подключён callback и кто публикует значения. Само объявление типа с поддержкой прогресса не создаёт события автоматически.