在Windows Phone 7上下载大文件时,WebClient和HttpWebRequest崩溃

时间:2011-04-29 21:15:26

标签: windows-phone-7

我已经尝试过WebClient和HttpWebRequest通过Wi-Fi连接下载大小为381MB的文件或系留。它保持崩溃(没有错误也没有例外)。它适用于大小为194MB的文件。有什么方法可以下载大文件吗?或者Windows Phone 7上的文件大小是否有限制?谢谢。

对于HttpWebRequest:Request.BeginGetResponse()从不'回调'; 对于WebClient:DownloadProgressChanged反应良好,但在OpenReadCompleted之前崩溃。 当文件较小时,相同的代码工作正常,例如194MB。

以下是WebClient的代码:

   WebClient wc = new WebClient();
   wc.DownloadProgressChanged += ((s, e) =>
   {
       UpdateProgress(e.BytesReceived, e.TotalBytesToReceive);
   });

   wc.OpenReadCompleted += delegate(object sender, OpenReadCompletedEventArgs e)
   {
       if (e.Error == null)
       {
           using (var storeIso = IsolatedStorageFile.GetUserStoreForApplication())
           {
               if (e.Result.Length < storeIso.AvailableFreeSpace)
               {
                   if (storeIso.FileExists(LocalFilePath))
                      storeIso.DeleteFile(LocalFilePath);

                   using (var fs = 
                          new IsolatedStorageFileStream(LocalFilePath,
                          FileMode.Create, storeIso))
                   {
                      int bytesRead;
                      byte[] bytes = new byte[1024 * 1024 * 1]; // 1meg
                      while ((bytesRead = 
                         ResponseStream.Read(bytes, 0, bytes.Length)) != 0)
                      {
                        fs.Write(bytes, 0, bytesRead);
                      }
                      fs.Flush();
                    }
               }
           }
       }
   };

   wc.OpenReadAsync(
    new System.Uri(DownloadFilePath, System.UriKind.RelativeOrAbsolute));

UpdateProgress用于计算百分比。 当我尝试使用大小为381 MB的文件时,应用程序在调用OpenReadCompleted之前崩溃。 当我尝试HttpWebRequest时类似,为大小为381MB的文件调用分配给Request.BeginGetResponse()的回调。

对于较小的文件大小,它可以使用WebClient或HttpWebRequest正常工作。在我看来,将下载的文件交给应用程序时存在“内存”限制吗?

2 个答案:

答案 0 :(得分:1)

对于大型文件(估计超过3MB),请务必设置HttpWebRequest.AllowReadStreamBuffering = false。这将使数据移动。

答案 1 :(得分:0)

是的,平台上有内存限制。你在监视这些吗? (有关如何操作的详细信息,请参阅http://blogs.msdn.com/b/mikeormond/archive/2010/12/16/monitoring-memory-usage-on-windows-phone-7.aspx。)

您需要考虑使用多个请求(使用Range标头)来下载大文件。除了避免内存限制之外,这还允许用户在下载过程中停止您的应用程序,然后在不必重新启动下载的情况下重新启动它。
我已经使用这种技术在手机上下载高达2.5GB的文件。