2011-04-29 91 views
1

我试过WebClient和HttpWebRequest通过Wi-Fi连接或连接下载大小为381MB的文件。它保持崩溃(没有错误也没有例外)。它适用于大小为194MB的文件。任何方式来下载大文件?或者Windows Phone 7下的文件大小是否有限制?谢谢。WebClient和HttpWebRequest在Windows Phone 7上下载大文件时崩溃

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

这里是Web客户端的代码:

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时,类似的情况是,分配给Request.BeginGetResponse()的回调未针对大小为381MB的文件调用。

对于较小的文件大小,使用WebClient或HttpWebRequest可以很好地工作。在我看来,将下载的文件传递给应用程序时存在“内存”限制?

+0

你能发表一些代码吗? – Egon 2011-05-01 04:20:28

回答

0

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

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

+0

2.5 Gb通过wifi? – AwkwardCoder 2011-05-03 22:51:15

+0

@AwkwardCoder是的,通过Wi-Fi。这远非理想/理想,但可以完成。 – 2011-05-04 07:21:12

+0

你能分享一些你如何做这件事的示例代码,或者你有博客吗?这将是非常有用的。 – NER1808 2013-02-19 18:12:45

1

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

相关问题