При загрузке файлов в фоновом режиме я не могу получить список активных загрузок. UWP - PullRequest
0 голосов

При загрузке файлов в фоновом режиме я не могу получить список активных загрузок. ActiveDownloads = System._COMobject. Что я делаю не так?

 List<DownloadOperation> activeDownloads = new List<DownloadOperation>();
 IReadOnlyList<DownloadOperation> downloads = null;
     try
        {
         downloads = await BackgroundDownloader.GetCurrentDownloadsAsync();
         if (downloads?.Count > 0)
             {
              foreach (DownloadOperation download in downloads)
                  {
                    activeDownloads.Add(download);
                   }
             }
         } 

попробуйте использовать BackgroundTransferGroup и получите тот же результат

 IEnumerable<DownloadOperation> activeDownloads = BackgroundDownloader.GetCurrentDownloadsForTransferGroupAsync(backgroundTransferCompletionGroup).GetAwaiter().GetResult();

1 Ответ

0 голосов
/ 14 июля 2020

Я пробовал ваш код, вы можете запутаться при отладке, Visual Studio показывает downloads тип не IReadOnlyList<DownloadOperation>, а System._ComObject.

Это потому, что BackgroundDownloader.GetCurrentDownloadsAsync - это данные, полученные через интерфейс COM, поэтому Visual Studio будет отображаться как System._ComObject, это только временное состояние.

При отладке, если вы развернете downloads, вы увидите m_ObjectToDataMap = null, что также является результатом Вывод Visual Studio на основе текущего контекста. Обычно нам не нужно учитывать тип System._ComObject при разработке, приложение преобразует его в тип IReadOnlyList<DownloadOperation> после получения данных.

Результат, возвращаемый BackgroundDownloader.GetCurrentDownloadsAsync(), равен нулю, что указывает на то, что в настоящее время нет ожидающей загрузки коллекции, связанной с группой фоновой передачи.

Здесь следует отметить два основных момента.

Первый - это ожидающая загрузка. Это означает, что вы создали DownloadOpeartion и загрузили его, но завершили работу до завершения (например, закрыли приложение). В следующий раз, когда вы запустите приложение, вы можете получить последний незавершенный список загрузок с помощью метода GetCurrentDownloadsAsync. Но если вы запустите загрузку по тому же адресу при запуске приложения, оно заменит последнюю незавершенную загрузку, потому что BackgroundDownloader не поддерживает одновременные загрузки одного и того же Uri.

Во-вторых, список загрузок полученное вами не входит в определенную группу c, иначе вы не сможете получить его с помощью метода GetCurrentDownloadsAsync.

...