我一直在对C#.NET WPF应用程序进行内存分析,我发现有大量的Byte []实例留在内存中。它们主要由 StreamAsIStream 句柄实例保持活动,这些句柄引用System.IO.MemoryStream实例,最终引用System.Byte []实例。
这些System.Byte []实例的内存超过5mb,所以我想了解为什么他们会坐在记忆中,如果我有什么办法可以摆脱它们(除非它们是必要的,当然)。
我试图自己做一些研究,但我找不到多少。我见过的唯一一件事就是在WPF应用程序中托管WinForms元素时使用ElementHost,但整个程序中并没有使用ElementHost。
我能够在 SystemAsIStream 的构造函数中放置断点,并发现当我使用流创建新的BitmapImage实例时会实例化这些对象,但是即使在BitmapImage实例之后它们仍然存在GC'd。
我还使用WinDBG尝试检查 SystemAsIStream 实例,但我对使用该程序的经验不是很丰富。我能收集的最多的是实例是强有力的句柄,但我基本上已经知道了。
有没有人知道为什么会发生这种情况以及我能做些什么呢?关于StreamAsIStream的更多信息将不胜感激。
更多信息:我使用的是.NET 4.0,我的目标平台是x86。
编辑:使用以下代码创建BitmapImage实例:
public static BitmapImage BitmapImageFrom(Stream stream)
{
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CreateOptions = BitmapCreateOptions.None;
image.StreamSource = stream;
image.EndInit();
return image;
}
该流来自以下内容:
stream = Application.GetResourceStream(new Uri(string.Format(@"pack://application:,,,/Images/{0}/{1}", folder, imageName))).Stream;
我尝试通过将他们的CacheOption字段设置为BitmapCacheOption.OnLoad并处理流来创建BitmapImages,但这似乎没有什么区别(可能是错的 - 我可能做错了什么的)