计划代理内存泄漏

本文关键字:泄漏 内存 代理 计划 | 更新日期: 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。)"

希望能有所帮助。