0

作为我正在参加的在线课程的一部分,我正在开发一个应用程序来从互联网上下载一些图像,然后将它们存储在手机中,最后访问图像以将它们放入列表框中。

在一种方法中,我实现了以下内容:

if (BackgroundTransferService.Requests.Count() != 0)
{
    foreach (var item in BackgroundTransferService.Requests)
    {
        item.TransferProgressChanged += item_TransferProgressChanged;
        item.TransferStatusChanged += item_TransferStatusChanged;
    }
}

在 Item_TransferStatusChanged 中,我检查下载传输是否已完成,然后使用 IsolatedStorageFile 类调用另一个方法将图像存储在手机中。

但是,问题是下载传输过程有时会被冻结。比方说,我正在下载 10 张图像,并且该过程被冻结在 6 张图像中。

为什么会发生这种情况的任何线索或帮助都会非常有帮助

问候!

4

1 回答 1

2

在使用 BackgroundTransferService 之前,您必须考虑各种场景。

  1. Windows phone 8 支持每个应用程序最多 25 个下载队列。一次,单个设备最多可以同时下载 2 个文件。因此,每当您使用 BackgroundTransferService 添加内容时,它都会进入队列。所以在向BackgroundTransferService队列添加东西之前,检查BackgroundTransferService.Requests.Count(),它必须小于25,否则Add会抛出异常。

  2. 在 UI 线程中触发 TransferStatusChanged。如果您遇到任何异常,您的 UI 将变得迟缓。我认为您的 IsoloatedStorage 代码正在引发异常。

  3. 假设您开始了 25 次下载,并且在完成之前关闭了应用程序。由于您正在使用此服务,尽管应用程序已关闭,但所有文件都将被下载,但下一个实例每当您尝试启动和下载文件时,BackgroundTransferService.Add 将失败,因为 BackgroundTransferService 队列中有 25 个项目。由于您关闭了应用程序,因此您没有时间将其从队列中删除。建议在应用程序启动期间或任何适用的地方删除这些文件。代码片段:

      public class BackgroundTransferServicesRequest
      {
         static public void RemoveCompletedBackgroundServicesFromQueue()
         {
           foreach (var v in BackgroundTransferService.Requests)
           {
              if (v.TransferStatus == TransferStatus.Completed)
             {
                BackgroundTransferService.Remove(v);
             }
           }
         }
      }
    
于 2014-03-21T09:01:06.107 回答