我有一个应用程序,需要下载和保存文件上的设备-视频。
视频很短~10分钟,质量很差,这意味着它们的大小是最小的。
所以,问题是当我下载一些文件时--所有的文件都很好,但是有些文件会出错:内存不足异常。从逻辑上讲,我认为小于某个大小(例如50 but )的文件可以很好地下载,但异常更高。
这是我的代码:
private void btnDownload2_Click(object sender, RoutedEventArgs e)
{
WebClient webClient = new WebClient();
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
webClient.OpenReadAsync(new Uri("http://somelink/video/nameOfFile.mp4"));
}
void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
try
{
if (progressMedia.Value <= progressMedia.Maximum)
{
progressMedia.Value = (double)e.ProgressPercentage;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
protected bool IncreaseIsolatedStorageSpace(long quotaSizeDemand)
{
bool CanSizeIncrease = false;
IsolatedStorageFile isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication();
//Get the Available space
long maxAvailableSpace = isolatedStorageFile.AvailableFreeSpace;
if (quotaSizeDemand > maxAvailableSpace)
{
if (!isolatedStorageFile.IncreaseQuotaTo(isolatedStorageFile.Quota + quotaSizeDemand))
{
CanSizeIncrease = false;
return CanSizeIncrease;
}
CanSizeIncrease = true;
return CanSizeIncrease;
}
return CanSizeIncrease;
}
void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
try
{
if (e.Result != null)
{
#region Isolated Storage Copy Code
isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication();
bool checkQuotaIncrease = IncreaseIsolatedStorageSpace(e.Result.Length);
string VideoFile = "PlayFile.wmv";
isolatedStorageFileStream = new IsolatedStorageFileStream(VideoFile, FileMode.Create, isolatedStorageFile);
long VideoFileLength = (long)e.Result.Length;
byte[] byteImage = new byte[VideoFileLength];
e.Result.Read(byteImage, 0, byteImage.Length);
isolatedStorageFileStream.Write(byteImage, 0, byteImage.Length);
#endregion
mediaFile.SetSource(isolatedStorageFileStream);
mediaFile.Play();
progressMedia.Visibility = Visibility.Collapsed;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void mediaFile_MediaEnded(object sender, RoutedEventArgs e)
{
MessageBoxResult res = MessageBox.Show("Do you want to Replay the file", "Decide", MessageBoxButton.OKCancel);
if (res == MessageBoxResult.OK)
{
mediaFile.Play();
}
else
{
isolatedStorageFileStream.Close();
isolatedStorageFile.Dispose();
mediaFile.ClearValue(MediaElement.SourceProperty);
}
}例外细节:
System.OutOfMemoryException是未处理的消息:在System.Windows.ni.dll中发生了“System.OutOfMemoryException”类型的未处理异常
异常图像:

有办法解决这个问题吗?
发布于 2013-10-24 11:00:59
当响应完全加载时,它完全驻留在内存中。这导致了你的OutOfMemoryException。解决方案是直接将响应“流”到隔离存储中。
请注意,下面的解决方案目前有一个缺点,即您正在丢失下载进度信息。
public async void btnDownload2_Click()
{
try
{
var httpClient = new HttpClient();
var response = await httpClient.GetAsync(new Uri("http://somelink/video/nameOfFile.mp4"), HttpCompletionOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();
using(var isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication())
{
bool checkQuotaIncrease = IncreaseIsolatedStorageSpace(e.Result.Length);
string VideoFile = "PlayFile.wmv";
using(var isolatedStorageFileStream = new IsolatedStorageFileStream(VideoFile, FileMode.Create, isolatedStorageFile))
{
using(var stm = await response.Content.ReadAsStreamAsync())
{
stm.CopyTo(isolatedStorageFileStream);
}
}
}
}
catch(Exception)
{
// TODO: add error handling
}
}https://stackoverflow.com/questions/19563753
复制相似问题