gpt4 book ai didi

c# - binaryreader 内存泄漏 Windows Phone 8

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:29 27 4
gpt4 key购买 nike

我正在尝试弄清楚是什么为我的 Windows Phone 7.1 应用程序保留了内存。该应用程序从 SkyDrive 下载全分辨率图像。它将这些图像连接到 Image 中的元素并将它们显示在 Canvas 上。我已经玩了一段时间(太久了!)并且最近重新编写了我的代码以如下手动下载图像,因为我使用 BitmapImage.SetSource(新 URI(等))发生了悲惨的内存泄漏。现在好多了,但我仍然有泄漏。想知道是否有人可以在我的代码中发现它,非常感谢!

这是来自内存分析器的图像: http://sdrv.ms/18aXLja (此处信誉不足,无法直接发布图片,抱歉)

这是进行调用的代码。此代码由指向图像 URL 的 WebClient 实例的 OpenReadCompleted 事件触发。此代码针对图中的每个图像加载运行(确切地说是 56 次)。我想不通的是:- 为什么内存流在关闭后仍保留在内存中(图像中未显示的是在堆上为 BitmapImage.Sour 单独分配)。
- 为什么 BinaryReader 分配仍在堆上- 为什么所有 ExpandArray 分配仍在堆上。

提前感谢您的见解!

 void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
App.Progress.ProgressHide();

if (null != e.Error)
{ return; }

int index = iCenterImage;

if (null != e.UserState)
index = (int) e.UserState;

MemoryStream ms = new MemoryStream(350000);
//MemoryStream ms = new MemoryStream();
BinaryReader br = new BinaryReader(e.Result);

int bytesRead = 0;
int bufferLength = 4096;
byte[] buffer = new byte[bufferLength];

bytesRead = br.Read(buffer, 0, bufferLength);

while(bytesRead > 0)
{
ms.Write(buffer, 0, bytesRead);
bytesRead = br.Read(buffer, 0, bufferLength);
}

br.Close();
br.Dispose();
br = null;

BitmapImage b = new BitmapImage();
b.SetSource(ms);
ms.Close();
ms.Dispose();
ms = null;


if (iCenterImage == index)
{
centerImage.Source = null;
centerImage.Source = b;
}
else if (iCenterImage - 1 == index)
{
leftImage.Source = null;
leftImage.Source = b;

}
else if (iCenterImage + 1 == index)
{
rightImage.Source = null;
rightImage.Source = b;
}
}

最佳答案

不要在流和读取器上手动调用 Close()/Dispose()。 Use using block.

对于内存分析器中的每个实例,您都可以看到调用堆栈以了解谁分配了该对象。

基本上 Windows Phone 图像内容(内部图像缓存)中存在已知的内存泄漏

尝试替换这一行

rightImage.Source = null;

(rightImage.Source as BitmapImage).UriSource = null;
(rightImage.Source as BitmapImage).SetSource(null);

关于c# - binaryreader 内存泄漏 Windows Phone 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17278890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com