1

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);
    }
}

編集:気にしないで、何が問題なのかを突き止めましたが、実際にはコードの別の部分にありました。リストを作成し、その要素の 1 つを毎秒 UI に割り当てました。次に、新しいものを割り当てるときに、UI が以前のものを解放しなかったようで、大量のリストが宙に浮いていました。

4

1 に答える 1

0

上記のコードでメモリ リークが発生しているようには見えません。また、3 時間で 150 MB というのは、バックグラウンド タスクとしてはかなりの量です。その期間中に実際にトリガーされるのは何回ですか?

何もしないか、バックグラウンド タスクを無効にして、メモリ リークに何らかの関係があるかどうかを確認してください。

ただし、これに対処する最善の方法は、メモリの増加に気付いた後でメモリの内容を分析することです。現在、(私が知っている) Windows ストア アプリ用のサード パーティ製メモリ プロファイラーは利用できないため、Debugging Tools for Windows のWinDbg を使用する必要があります。これは、開始するための素敵なブログ投稿です。また、Filip SkakunによるこのSOの回答も役立つ場合があります。

于 2013-02-08T08:06:08.897 に答える