Windows应用商店应用程序背景任务内存泄漏
本文关键字:任务 内存 泄漏 背景 应用程序 应用 Windows | 更新日期: 2023-09-27 17:58:25
我的Windows应用商店应用程序中出现了一个相当有问题的内存泄漏。由于它甚至在后台也在泄漏,我认为BackgroundTask导致了泄漏。泄漏相当严重,在3个小时左右的时间内积累了150MB。有什么想法吗?
public async void Run(IBackgroundTaskInstance taskInstance)
{
var defferal = taskInstance.GetDeferral();
var localFolder = ApplicationData.Current.RoamingFolder;
var file = await localFolder.CreateFileAsync("notes.txt", CreationCollisionOption.OpenIfExists);
string s = await FileIO.ReadTextAsync(file);
RefreshTile(s);
defferal.Complete();
}
private void RefreshTile(string notes)
{
DateTimeFormatInfo info = DateTimeFormatInfo.CurrentInfo;
TileUpdateManager.CreateTileUpdaterForApplication().Clear();
XmlDocument tileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWideBlockAndText01);
var tileTextAttributes = tileXml.GetElementsByTagName("text");
tileTextAttributes.Item(4).AppendChild(tileXml.CreateTextNode(DateTime.Now.Day.ToString()));
tileTextAttributes.Item(5).AppendChild(tileXml.CreateTextNode(info.GetDayName(DateTime.Now.DayOfWeek)));
XmlDocument squareTileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquareText01);
XmlNodeList squareTextElements = squareTileXml.GetElementsByTagName("text");
squareTextElements.Item(0).AppendChild(squareTileXml.CreateTextNode(DateTime.Now.Day.ToString()));
squareTextElements.Item(1).AppendChild(squareTileXml.CreateTextNode(info.GetDayName(DateTime.Now.DayOfWeek)));
IXmlNode subnode = tileXml.ImportNode(squareTileXml.GetElementsByTagName("binding").Item(0), true);
tileXml.GetElementsByTagName("visual").Item(0).AppendChild(subnode);
TileNotification tile = new TileNotification(tileXml);
TileUpdateManager.CreateTileUpdaterForApplication().Clear();
TileUpdateManager.CreateTileUpdaterForApplication().EnableNotificationQueue(true);
TileUpdateManager.CreateTileUpdaterForApplication().Update(tile);
var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
string s = loader.GetString("NotepadText");
loader = null;
if (notes != null && notes.Trim() != "" && notes != s)
{
XmlDocument tile2Xml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWideText04);
var tile2TextAttributes = tile2Xml.GetElementsByTagName("text");
tile2TextAttributes.Item(0).AppendChild(tile2Xml.CreateTextNode(notes ?? ""));
TileNotification tile2 = new TileNotification(tile2Xml);
TileUpdateManager.CreateTileUpdaterForApplication().Update(tile2);
}
else
{
TileUpdateManager.CreateTileUpdaterForApplication().EnableNotificationQueue(false);
}
}
EDIT:没关系,发现了问题所在,它实际上在代码的另一部分。我创建了一个列表,每秒为UI分配一个元素。然后,当分配新的列表时,UI似乎没有发布前一个,所以我有大量的列表悬而未决。
上面的代码中似乎没有任何内存泄漏。另外,对于一个后台任务来说,3小时内150 MB是相当大的。在此期间,它实际触发了多少次?
您可以尝试什么都不做或禁用后台任务,看看它是否与内存泄漏有关。
不过,最好的方法是在你注意到内存增加后分析内存的内容。由于目前没有任何适用于Windows应用商店应用程序的第三方内存探查器(据我所知),您需要使用Windows调试工具中的WinDbg。这是一篇很好的博客文章,让你开始。此外,Filip Skakun的SO回答可能会有所帮助。