计划代理内存泄漏
本文关键字:泄漏 内存 代理 计划 | 更新日期: 2023-09-27 18:06:40
问候大家,我在WP8应用程序的ScheduledAgent中有内存泄漏的问题。我要做的是在循环中更新应用程序的多个瓦片,似乎还可以(关于内存使用),但出于某种原因,瓦片更新后内存没有释放。
我的代码看起来像这样(内存使用由Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage测量):
protected override void OnInvoke(ScheduledTask task)
{
try
{
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
// 5MB used
foreach (int id in myIdsList)
UpdateTile(id);
});
}
catch (Exception e)
{
if (Debugger.IsAttached)
Debugger.Break();
}
NotifyComplete();
}
更新方法如下:
public void UpdateTile(int id)
{
MyClass myClassInstance = GetInstanceById(id);
//~6MB used by now
Canvas drawingSurface = new Canvas();
//Add some Image objects to canvas (source to each image is a filePath
// contained in myClassInstance)
//~7MB
WriteableBitmap bigTileImage = new WriteableBitmap(691, 336);
bigTileImage.Render(drawingSurface, null);
bigTileImage.Invalidate();
//~9MB
var bigTilePath = string.Format(/*path here*/);
using (IsolatedStorageFile storage =
IsolatedStorageFile.GetUserStoreForApplication())
{
if (storage.FileExists(bigTilePath))
storage.DeleteFile(bigTilePath);
using (var isoFileStream = new IsolatedStorageFileStream(
bigTilePath, FileMode.Create, storage))
{
bigTileImage.SaveJpeg(isoFileStream, bigTileImage.PixelWidth,
bigTileImage.PixelHeight, 0, 100);
}
}
ShellTile tileToUpdate = ShellTile.ActiveTiles.FirstOrDefault(
x => x.NavigationUri.ToString().Contains("TileID="+id));
FlipTileData flipTileData = new FlipTileData()
{
//Set fields
WideBackgroundImage =
new Uri(("isostore:/"+bigTilePath, UriKind.Absolute),
};
tileToUpdate.Update(flipTileData);
//~10MB used
//Shouldn't memory be released by now??
// calling GC.Collect() has no effect
}
所以,这是一个PeriodicTask,我有11MB的内存上限,只要内存在迭代后没有释放,我得到OutOfMemoryException。
也许我不了解基本知识,但我认为大部分占用的内存应该在将文件保存到IS后释放(或者每当GC决定收集时,但是,正如我所说的,即使显式调用GC.Collect()
也没有效果)?
我做错了什么吗?有没有办法释放这些记忆?
我不确定这是否是内存泄漏问题的唯一原因,但是;你正在创建一个tile对象,并且1)你没有使用它2)你也没有释放它
ShellTile tileToipdate = ShellTile. activetiles。FirstOrDefault (x =>x.NavigationUri.ToString () .Contains("TileID = " + id));
这个tileToipdate对象做什么?你在查询它之后没有使用它。如果没有用,就把它去掉,看看会不会有什么变化。
如果你要使用这个对象,调用tileToipdate.Finalize()方法(在你完成它之后),这里引用了"允许对象在被垃圾回收之前尝试释放资源并执行其他清理操作"。(继承自Object。)"
希望能有所帮助。