WPF TreeViewItem序列化程序导致内存泄漏

时间:2017-08-31 12:21:17

标签: c# .net xml wpf treeview

在我的应用程序中,我有一个接受任何可序列化对象的方法,并将其序列化以填充我的TreeView。 xml通常非常大而且非常动态,可以是500-1000行,但每次加载新的XML时,RAM都会上升,我怀疑我的清理不正确/已满。所有方法都列在下面

public static void PopulateTreeView<T>(this TreeView mainTree, T serializableObject)
        {
            try
            {
                var xmlDocument = new XmlDocument();
                xmlDocument.LoadXml(XmlExtensions.SerializeObject(serializableObject));

                var xmlNodes = xmlDocument.DocumentElement;

                var tNode = mainTree.Items[mainTree.Items.Count - 1];

                Task task = Task.Run(() =>
                {
                    AddNode(xmlNodes, (TreeViewItem)tNode);
                });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, @"Exception has occured", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

我可以用任何类型的对象来称呼它非常简单

uxItemsTreeView.PopulateTreeView(_myOrder?.Items);

当我加载一些新的xml时,我正在为该TreeView进行预清理

UserInterfaceHelper.FindVisualChildren<TreeView>(this).ToList().ForEach(x =>
{
           x.Tag = "";
           x.Items.Clear();
});

我没有看到我甚至试图分别删除子项目的错误在哪里:

UserInterfaceHelper.FindVisualChildren<TreeView>(this).ToList().ForEach(x =>
{
          x.Tag = "";
          UserInterfaceHelper.FindVisualChildren<TreeViewItem>(x).ToList().ForEach(y =>
          {
               x.Items.Remove(y);
          });
          x.Items.Clear();
});

SerializableObject:

public static string SerializeObject(object value)
{
      using (var ms = new MemoryStream())
      {
                var serializer = new XmlSerializer(value.GetType());
                serializer.Serialize(ms, value);
                return Encoding.UTF8.GetString(ms.ToArray());
      }
}

并添加注释

 private static void AddNode(XmlNode inXmlNode, TreeViewItem inTreeNode)
    {
        XmlNode xNode;
        TreeViewItem tNode;
        XmlNodeList nodeList;
        int i;

        if (inXmlNode.HasChildNodes)
        {
            nodeList = inXmlNode.ChildNodes;
            for (i = 0; i <= nodeList.Count - 1; i++)
            {
                xNode = inXmlNode.ChildNodes[i];
                inTreeNode.InvokeEx(x => x.Items.Add(new TreeViewItem() { Header = xNode.Name }));
                tNode = (TreeViewItem)inTreeNode.Items[i];
                AddNode(xNode, tNode);
            }
        }
        else
        {
            inTreeNode.InvokeEx(x => x.Header = (inXmlNode.OuterXml).Trim());
        }
    }

但没有任何成功。根据对象的不同,每次加载RAM都可以轻松超过100MB +。 有人可以帮助我如何妥善处理旧的?

0 个答案:

没有答案