BackgroundDownloader 不适用于 Windows 10 移动版 UWP?

Posted

技术标签:

【中文标题】BackgroundDownloader 不适用于 Windows 10 移动版 UWP?【英文标题】:BackgroundDownloader is not working for windows 10 mobile UWP? 【发布时间】:2016-02-20 08:50:33 【问题描述】:

我正在创建一个 Windows 10 UWP 应用,其中涉及 BackgroundDownloader,它仅适用于桌面,不适用于手机。

代码:

    var dl = new BackgroundDownloader();
    dl.CostPolicy = BackgroundTransferCostPolicy.Always;
    file = await localSoundsFolder.CreateFileAsync(name, CreationCollisionOption.ReplaceExisting);
    if (file != null)
    
        var d = dl.CreateDownload(new Uri(uriToDownloadFrom,UriKind.RelativeOrAbsolute), file);
        d.Priority = BackgroundTransferPriority.High;

        var progressCallback = new Progress<DownloadOperation>(x => DownloadProgress(x, sc)); 
        try
        
            await d.StartAsync().AsTask(cancellationToken.Token,progressCallback);
            //After this line it doesn't progress!
            CancellationTokenSource token = Utility.cancellationList[sc];
            if (token != null)
            
                token.Cancel();
                Utility.cancellationList.Remove(sc);
                Debug.WriteLine("The sc has been removed from the download list");
            
        
        catch
        
            return;
        
    


private static void DownloadProgress(DownloadOperation download,SoundClass sc)

    Debug.WriteLine("Callback");
    var value = download.Progress.BytesReceived * 100 / download.Progress.TotalBytesToReceive;
    Debug.WriteLine("The bytesReceived is 0 and total bytes is 1", download.Progress.BytesReceived.ToString(), download.Progress.TotalBytesToReceive.ToString());
    new System.Threading.ManualResetEvent(false).WaitOne(10);
    sc.downloadProgress = value;
    if (download.Progress.Status == BackgroundTransferStatus.Completed || value >= 100)
    
        Debug.WriteLine("DONE donwloading the file 0", download.ResultFile.Name);
        Debug.WriteLine("The file name happened to be to be added was " + download.ResultFile.Name);
        string fileName = download.ResultFile.Name;
    

await d.StartAsync().AsTask(cancellationToken.Token,progressCallback); 行之后,程序不会继续。而且也没有错误。这不仅适用于手机,也适用于桌面!我错过了什么?

【问题讨论】:

这只是一个提示,但在上次终止后应用程序启动时,您应该枚举所有现有的 DownloadOperations 并将它们重新附加到当前会话。 BackgroundDownloader 不支持同一个 URI 的并发下载,因此如果有 DownloadOperation 挂在某处,则可能会导致问题。见msdn.microsoft.com/library/windows/apps/br207126 感谢 Liero 的提示,试过了,但还是不行。 我在没有 SoundClass 的情况下在 Mobile Emulator 10.0.10240 中测试了您的代码,因为我不知道它是什么并且您的代码运行良好。您是在模拟器中还是在真实设备中进行测试?这是来自 Microsoft 的 Background transfer sample,您可以使用您在代码中使用的 URI 对其进行测试,看看它是否有效。 我尝试了一个不同的 Uri,它是一个不同的来源,它工作。但我想知道服务器端可能出了什么问题,因为我生成的 Uri 是完美的,并且正在浏览器和应用程序的桌面模式上运行?编辑:在另一部手机上尝试过,它也可以在那里工作。所以我想问题出在手机上。 @AbsoluteSith 你解决了吗?我的 Lumia 920 也有同样的问题。 【参考方案1】:

BackgroundDownloader 我认为 Windows UWP 中的所有 BackgroundTasks 都很难与它们一起工作。 您必须首先在当前解决方案中创建一个新解决方案作为 Windows 运行时组件。 之后,您必须通过 Package.AppxManifest 链接它。 呃,不要忘记将运行时组件作为主项目的参考。 如果你有希望地做这些事情,那一定是工作。但请确保您有一个 RuntimeComponent 并将其链接到您的项目中

【讨论】:

我非常怀疑我们是否需要创建 BackgroundTask 才能进行后台下载。所以这并不是真正的解决方案。【参考方案2】:

我们在完全相同的问题上苦苦挣扎,但在通用 Windows 10 应用程序上,而不是在手机上。在我们的案例中,罪魁祸首是 Windows 10 的节电模式。在 Windows 10 设备上,点击电池图标。这应该会调出电池和屏幕亮度弹出按钮。禁用电池模式。

任何使用后台下载器的应用程序的效果都是相同的,包括 MSDN 下载示例应用程序。

同样,这不是在移动设备上,而是在我们的 Windows 10 应用上始终如一地发生。希望和手机一样。

【讨论】:

【参考方案3】:

在我的情况下,通过 USB 数据线将手机连接到笔记本电脑,相同的代码无法在 Debug 模式下运行,但通过下载和安装应用程序即可运行处于发布模式。

【讨论】:

以上是关于BackgroundDownloader 不适用于 Windows 10 移动版 UWP?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UITableViewAutomaticDimension 不适用于 sectionFooterHeight?

为啥排序不适用于矢量?

验证不适用于 saveMany

UipanGesture 不适用于 Uiswitch

jQuery 不适用于 Express

为啥 MultiBinding 不适用于 CornerRadius