我创建了一个图像使用此功能后:一个BitmapImage的配置问题的公司被冻结
private BitmapImage LoadImage(byte[] imageData)
{
if (imageData == null || imageData.Length == 0) return null;
var image = new BitmapImage();
using (var mem = new MemoryStream(imageData))
{
mem.Position = 0;
image.BeginInit();
image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = null;
image.StreamSource = mem;
image.EndInit();
}
image.Freeze();
return image;
}
当我试图处置它:
myImage.StreamSource.Close();
myImage.StreamSource.Dispose();
// Throws an exception since its frozen to read only
//myImage.StreamSource = null;
GC.Collect();
它不会被垃圾收集器收集。可能因为我无法将其设置为null
。
我该如何处置这个BitmapImage
因此它不会在内存中活得更久?
我可以用此代码确认字节数组没有被释放,但仍有一个引用的地方。你可以通过给它添加一个'WeakReference'并检查'IsAlive'属性来测试它。我在发布模式下执行此操作时没有附加任何调试器。 – Stuart
增加了一些测试代码。在这种情况下,我不确定为什么'IsAlive'对你来说是'真的'。如果我在同一个函数和Debug模式下调用了GC,它会返回'true',但是如果它处于相同的函数和释放模式下,它仍然是'false'。也许你可以分享你使用的确切代码? – RandomEngy
@Stuart当跟踪传入内存流的字节数组时,我也会得到相同的结果。 – RandomEngy