我有一个返回BitmapImage
的函数:
private BitmapImage dfa2bmp(DFA dfa)
{
//[...]
//myGraph.png generated here[...]
BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.CacheOption = BitmapCacheOption.OnLoad;
bmp.UriSource = new Uri(graphvizDir + "\\myGraph.png");
bmp.EndInit();
File.Delete(graphvizDir + "\\myGraph.png");
return bmp;
}
所以在每次调用之后,文件myGraph.png都不同了。但是,当我将dfa2bmp
的返回值分配给Image控件时,我仍然会获得旧图像,即使它在上一次调用我的函数时被删除了。
我做错了什么?
答案 0 :(得分:0)
bmp.CacheOption = BitmapCacheOption.OnLoad;
这一行将图像缓存在RAM中,然后从那里显示它。文档说;
在加载时将整个映像缓存到内存中。所有图像数据请求都从内存存储器中填充。
如果要阻止程序在删除后使用该图像,请将BitmapCacheOption更改为none。所以; bmp.CacheOption = BitmapCacheOption.None;
会做你想做的事。
编辑:我不知道这会产生什么副作用,我并没有真正处理这些库,但是当你尝试将删除的图像分配给图像控件时,我发现有一些异常可能。我认为更好的解决方案可能是将对象设置为null
,这将导致GC释放包含图像的内存。
答案 1 :(得分:0)
您需要将BitmapCreateOptions
设置为IgnoreImageCache
。
bmp.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
如果您有需要刷新的图片,请使用BitmapCreateOptions.IgnoreImageCache
// Summary: // Loads images without using an existing image cache. This option should only // be selected when images in a cache need to be refreshed. IgnoreImageCache = 8,