作为在线课程的一部分,我正在开发一个应用程序,从互联网上下载一些图像,然后将它们存储在手机中,最后访问图像,将它们放入列表框。
在一种方法中,我实现了以下内容:
if (BackgroundTransferService.Requests.Count() != 0)
{
foreach (var item in BackgroundTransferService.Requests)
{
item.TransferProgressChanged += item_TransferProgressChanged;
item.TransferStatusChanged += item_TransferStatusChanged;
}
}
在Item_TransferStatusChanged中,我检查下载传输是否已完成,然后使用IsolatedStorageFile类调用另一种方法将图像存储在手机中。
但是,问题是下载传输过程会被冻结一些时间。比方说,我正在下载10张图片,并且过程会在6张图片中冻结。
任何线索或帮助为什么会发生这种情况会非常有帮助
问候!
答案 0 :(得分:2)
在使用BackgroundTransferService之前,您必须考虑各种场景。
Windows phone 8支持每个应用程序最多25个下载队列。在一次中,单个设备可以同时下载最多2个文件。因此,无论何时使用BackgroundTransferService添加内容,它都将进入队列。 因此,在向BackgroundTransferService队列中添加内容之前,请检查BackgroundTransferService.Requests.Count(),它必须小于25,否则Add将抛出异常。
在UI线程中触发TransferStatusChanged。如果您遇到任何异常,您的UI将会缓慢。我认为您的IsoloatedStorage代码正在抛出异常。
假设您开始下载并在完成之前关闭了应用程序。由于您正在使用此服务,所有文件将在应用程序关闭时下载,但是每当您尝试启动和下载文件时,下一个实例,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);
}
}
}
}