内存流对内存/内存 c# wpf 有多大影响?



我目前对我的应用程序:(感到非常困惑。我的应用程序占用了太多内存。

基本上我的应用程序是一个WPF应用程序,它有3-4个窗口和几个页面,每个页面都在需要时打开/显示。每个窗口/页面都有几个Image控件来显示图像。要检索图像(从资源),我使用以下函数:

public BitmapImage LoadImage(Uri uri, bool LoadOnMemory, int Pixel)
{
if (LoadOnMemory == true)
{
System.Windows.Resources.StreamResourceInfo sri = Application.GetResourceStream(uri);
System.IO.BinaryReader binReader = new System.IO.BinaryReader(sri.Stream);
byte[] buffer = binReader.ReadBytes(sri.Stream.Length);
using (MemoryStream memoryStream = new MemoryStream(buffer))
{
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.Default;
bi.CreateOptions = BitmapCreateOptions.None;
bi.StreamSource = memoryStream;
bi.DecodePixelWidth = Pixel;
bi.EndInit();
bi.Freeze();
return bi;
}
}
else
{
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.Default;
bi.CreateOptions = BitmapCreateOptions.None;
bi.UriSource = uri;
bi.DecodePixelWidth = Pixel;
bi.EndInit();
bi.Freeze();
return bi;
}
}

我有,也许总共有 20 张图像并加载每个图像,该功能称为将Pixel设置为 30(有时为 40),LoadOnMemory设置为True。我的启动窗口有 2 张图像和一个TextBlock,调用相同的函数来加载两个图像。

一旦我的应用程序启动,在任务管理器中,我看到即使是只有 2-3 行代码来加载MainWindow的初始屏幕也会占用 105+ MB 的 RAM。当我的MainWindow加载时,RAM/内存的消耗高达 200+ mb。主窗口调用函数几次,因为MainWindow中有近 10 张图像。从那里开始,无论我打开多少Page或多少Window的图像,RAM的消耗都保持不变。由于某种原因,它不会超过 220+ mb。

我怀疑因为我的函数使用MemoryStream,这可能是内存消耗如此巨大的原因。

但后来我创建了一个没有代码隐藏的虚拟窗口,只有一个空白窗口并启动了我的应用程序......即使是空白窗口也会消耗 100+ mb 的内存!

但是虚拟窗口不是我关心的问题,我的qs是,例如,如果我的应用程序有20张图像,并且每个图像都是使用该函数加载的(或者我应该说内存流),它对RAM的影响有多大?(虽然我可以看到它使用了近 200+ MB)。我的函数不会在应用程序中引起任何滞后/性能问题,但我只需要知道该函数是否是造成如此巨大内存消耗的原因?

更新:很抱歉提供有关空白窗口的误导性信息

到目前为止,我一直在VS中运行该应用程序,因此内存的总消耗实际上是Intellitrace(消耗超过30mb)空白窗口(最大15-20 mb)的总和。

最后一个qs,因为我也更新了代码,哪个更好?代码的第二部分(不使用memorystream)或第一部分(使用memoryStream)在应用程序的性能和内存消耗

方面?

你当然不需要中间的 MemoryStream,当你可以直接从 StreamResourceInformation 的 Stream 加载 BitmapImage 时:

private ImageSource LoadImage(Uri resourceUri, int pixelWidth)
{
var resource = Application.GetResourceStream(resourceUri);
var bitmap = new BitmapImage();
using (var stream = resource.Stream)
{
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = stream;
bitmap.DecodePixelWidth = pixelWidth;
bitmap.EndInit();
bitmap.Freeze();
}
return bitmap;
}

但是,您根本不需要使用 Stream,这显然更简单:

private ImageSource LoadImage(Uri resourceUri, int pixelWidth)
{
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.UriSource = resourceUri;
bitmap.DecodePixelWidth = pixelWidth;
bitmap.EndInit();
bitmap.Freeze();
return bitmap;
}

最新更新