bitmapimage处理时的outofmemory异常

时间:2014-06-30 08:57:48

标签: c# out-of-memory

我创建了WPF windows应用程序,用于使用网格显示更多图像。当我运行OutOfMemory Exception时,我的以下代码获得了application.exe

byte[] buffer = File.ReadAllBytes(path);
File.Delete(path);
if (buffer == null)
   return null;
using (MemoryStream mStream = new MemoryStream(buffer))
{             
   BitmapImage bi = new BitmapImage();
   bi.BeginInit();
   bi.CacheOption = BitmapCacheOption.OnLoad;

   bi.StreamSource = mStream;
   bi.EndInit();              
   bitmap = bi;
   bitmap.Freeze();
   mStream.Close();
   mStream.Dispose();
}

我从stackoverflow找到了一些解决方案并改变了我的编码,如下所示,

BitmapImage image = new BitmapImage();
{
    image.BeginInit();
    // image.CreateOptions = BitmapCreateOptions.n;
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.UriSource = new Uri(path);
    image.EndInit();
    File.Delete(path);
    bitmap = image;
    image.UriSource = null;
    image = null;
}

但是此代码会因image used by another processcant open from locked file而异常。

我完全困惑为什么我的应用程序经常由OutOfMemory或used by another process异常引起?

1 个答案:

答案 0 :(得分:0)

从评论中得知,你做错了什么。您正在初始化obejct ob类型BitmapImage并立即将其声明为null。所以你事先宣布的所有事情都已经过去了。

您应该在此处使用using()语句功能。如果代码离开此语句,GarbageCollector将自动接管并为您处理所有内容:

using(BitmapImage image = new BitmapImage())
{
    image.BeginInit();
    // image.CreateOptions = BitmapCreateOptions.n;
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.UriSource = new Uri(path);
    image.EndInit();
    bitmap = image.Clone();
}