在后台下载文件时,我无法获得活动下载的列表。ActiveDownloads=系统_COM对象。我做错了什么?
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();
我试过你的代码,你可能会在调试时感到困惑,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()
返回的结果为null,表示当前没有与后台传输组关联的挂起下载集合。
这里有两点需要注意。
第一个是下载挂起。这意味着您已经创建了DownloadOpeartion
并下载了它,但在完成之前就终止了(例如关闭应用程序(。下次启动应用程序时,可以通过GetCurrentDownloadsAsync
方法获得最后一个未完成的下载列表。但是,如果在应用程序启动时在同一地址运行下载,它将替换最后一次未完成的下载,因为BackgroundDownloader
不支持同时下载相同的Uri。
二是您获取的下载列表不在特定的组中,否则无法通过GetCurrentDownloadsAsync
方法获取。