我正在使用下面的代码创建一个基于UI元素的实时图块.它渲染uiElementa WriteableBitmap,保存位图+返回文件名.此方法在Windows Phone后台任务代理中运行,我正在运行内存限制.
private string CreateLiveTileImage(Canvas uiElement, int width, int heigth)
{
var wbmp = new WriteableBitmap(width, heigth);
try
{
wbmp.Render(uiElement, null);
wbmp.Invalidate();
var tileImageName = _liveTileStoreLocation;
using (var stream = new IsolatedStorageFileStream(tileImageName, FileMode.Create, FileAccess.Write, IsolatedStorageFile.GetUserStoreForApplication()))
{
wbmp.SaveJpeg(stream, width, heigth, 0, 100);
stream.Close();
}
uiElement = null;
wbmp = null;
GC.Collect();
return "isostore:" + tileImageName;
}
catch (Exception exception)
{
// ...
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
我做了一些测试,问题是:这个方法泄漏内存,但我不知道为什么/在哪里?!
我也做了一些测试运行 - 在第一次进入这个方法之前:
Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage
7.249.920 Bytes
Run Code Online (Sandbox Code Playgroud)
这是好的,因为附加了调试器,它使用大约2 MB的内存.
再做一些此方法的运行(在调试器中再次设置为run方法):
Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage …Run Code Online (Sandbox Code Playgroud) 我正在测试一个WP8应用程序和它的图像查看器来显示许多图像,我发现应用程序的内存消耗正在提高,并希望找到如何解决它.
我已经从网上阅读了一些文章,但这些文章提供的解决方案不适用于我的应用,请阅读以下历史记录.
首先,我发现文章" Windows Phone 7的图像提示 "并下载其样本进行清洁图像缓存测试,它使用的是1张图像.
然后出于测试目的,我使用应用程序内的15个离线图像编译此应用程序,并设置为"内容",请从此处下载测试应用程序.
我的测试步骤是:
(1) Launch app
(2) Go to Image Caching page
(3) Enable checkbox "Avoid Image Caching"
(4) Continuously tapping button Show/Clear
(5) Keep watching the memory status textblock at the bottom
Run Code Online (Sandbox Code Playgroud)
当我测试我的应用程序时,内存正在提升,如16.02MB =>显示(19.32MB)=>清除(16.15MB)=>显示(20.18MB)=>清除(17.03MB)...等和内存即使离开缓存页面再次进入缓存页面也不会被释放.似乎文章" Windows Phone 7的图像提示 "的解决方案仅适用于1个图像.
这是" Windows Phone 7的图像提示 "解决方案的xaml和代码隐藏.
[Caching.xaml]
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<ToggleButton Content="Show" Width="150" Checked="ShowImageClicked" Unchecked="ClearImageClicked"/>
<CheckBox x:Name="cbAvoidCache" Content="Avoid Image …Run Code Online (Sandbox Code Playgroud)