如何使DownloadOperation更频繁地调用ProgressChanged事件?

时间:2016-07-12 08:28:34

标签: c# windows-runtime uwp

我正在使用UWP应用程序通过互联网下载一些文件。我使用BackgroundDownloader类在后台下载它们。这是我的代码。

public BackgroundDownloader backgroundDownloader = new BackgroundDownloader();
DownloadOperation downloadOperation = backgroundDownloader.CreateDownload(source, file);
Progress<DownloadOperation> progress = new Progress<DownloadOperation>(progressChanged);
CancellationTokenSource cancellationToken = new CancellationTokenSource();
await downloadOperation.StartAsync().AsTask(cancellationToken.Token, progress);

一切正常,但我注意到一种奇怪的行为。我在progressChanged方法中更新数据模型,该方法通知和更新UI。但是当下载文件时,当在慢速互联网连接上下载大约1MB的文件时会触发progressChanged事件,当我暂停下载并恢复它时,它会触发该事件,比如每隔几KB。我想知道有没有办法配置ProgressChanged事件的触发频率。我在互联网上搜索但一无所获。请帮忙。

1 个答案:

答案 0 :(得分:1)

感谢您的反馈。我可以在我身边看到类似的行为。暂停并恢复下载操作后,将更频繁地调用progressChanged处理程序。但是,没有API可以控制调用进程回调的频率。每次Windows运行时方法报告进度通知时,都将调用Progress<DownloadOperation>构造函数中设置的处理程序。但是这个实现是潜在的,我们无法控制它。

如果您确实想要提高频率,那么丑陋解决方法可能会暂停并在首次启动下载操作时在代码中恢复下载操作。例如,我们可以添加一个标志来标识首次启动的下载操作。

private bool firstStart = true;

然后在progressChanged处理程序中,暂停并恢复下载操作。

if (firstStart && currentProgress.Status == BackgroundTransferStatus.Running)
{
    download.Pause();
    await Task.Delay(100);
    download.Resume();
    firstStart = false;
}

这不是一个好习惯,我已在内部报告此问题。一旦取得任何进展,我会更新我的答案。