关闭应用程序时从 BackgroudDownloader 更新进度

Update progress from BackgroudDownloader when app is closed

我在我的 UWP 应用中使用 BackgroundDownloader,例如:

private async void StartDownload()
{
    var destinationFile = await KnownFolders.VideosLibrary.CreateFileAsync("temp.zip", CreationCollisionOption.GenerateUniqueName);
    var backgroundDownloader = new BackgroundDownloader();
    var downloadOperation = backgroundDownloader.CreateDownload(fileUrl, destinationFile);

    SendUpdatableToastWithProgress();
    var progressCallback = new Progress<DownloadOperation>();
    progressCallback.ProgressChanged += ProgressCallback_ProgressChanged;
    var opProgress = await downloadOperation.StartAsync().AsTask(progressCallback);
}

private void ProgressCallback_ProgressChanged(object sender, DownloadOperation e)
{
    if (e.Progress.TotalBytesToReceive > 0)
    {
        var br = e.Progress.BytesReceived;
        var percent = br * 1.0 / e.Progress.TotalBytesToReceive;
        UpdateToastProgress(percent);
    }
}

即使 UWP 应用程序关闭,我是否有机会触发 ProgressChanged?

目前没有关于如何通过 Progress<DownloadOperation> 更新 BackgroundDonwloader 通知中的 BackgroundDonwloader 进度的可靠选项。

根据Microsoft documentationBackgroundTask 可以根据实际系统状态暂停或终止。这可能会在 BackgroundDownloader 完成其工作之前发生,并且您的 Toast 通知看起来会 frozen.

此处最好的方法是使用 AdaptiveProgressBarValue.Indeterminate 更新应用暂停或退出事件中的 Toast 进度条,并发送适当的短信(例如,在后台完成下载等)。根据@Faywang - MSFT 的评论,即使应用程序已关闭或暂停,您仍然可以获得有关下载成功或失败的通知。

另一种方法是使用 extendedExecutionUnconstrained 来无限期地 运行 BackgroundTask。在这种情况下,您将能够使用 'live' 数据更新 Toast 进度甚至更多,以通过 BackgroundDownloader 触发新的下载。这种方法的缺点是您的应用 cannot be listed in Microsoft Store.