在我的应用程序中,我有一个接受任何可序列化对象的方法,并将其序列化以填充我的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 +。 有人可以帮助我如何妥善处理旧的?