我创建了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 process
或cant open from locked file
而异常。
我完全困惑为什么我的应用程序经常由OutOfMemory或used by another process
异常引起?
答案 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();
}