我已经尝试过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正常工作。在我看来,将下载的文件交给应用程序时存在“内存”限制吗?
答案 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的文件。