c# - 填充 TreeView 时出现 "Out of Memory"

标签 c# windows

当我使用 XML 填充 TreeView 层次结构时,我遇到了“内存不足”问题。我们的 XML 结构非常复杂,而且格式不固定。有多个级别的子节点。我正在使用递归来迭代 XML 并填充 TreeView 结构。我试着调用 GC.Collect。清除内存但它仍然抛出相同的错误。 我正在使用 .NET Framework 3.5 的 C# 进行开发。

如果您能帮我找到解决方案,我将不胜感激。

我在下面提供了用于填充 TreeView 的代码

private void addTreeNode(XmlNode xmlNode, TreeNode treeNode)
{
    string attribute = "";

    treeView1.ImageList = imageList1;
    treeViewResponse.ImageList = imageList1;
    XmlNode xNode;
    TreeNode tNode;
    XmlNodeList xNodeList;
    foo.MoveToFollowing(XPathNodeType.Element);
    namespaces1 = foo.GetNamespacesInScope(XmlNamespaceScope.All);
    if (xmlNode.HasChildNodes)
    {

        treeNode.ImageIndex = 0;
        treeNode.SelectedImageIndex = 0;
        xNodeList = xmlNode.ChildNodes;
        for (int x = 0; x <= xNodeList.Count - 1; x++)
        {
            xNode = xmlNode.ChildNodes[x];
            treeNode.Nodes.Add(new TreeNode(xNode.Name));
            tNode = treeNode.Nodes[x];
            //treeNode.Nodes[x].ImageIndex = -1;
            addTreeNode(xNode, tNode);
        }
    }
    else
    {
        treeNode.ImageIndex = 1;
        treeNode.NodeFont = new Font("Arial", 8, FontStyle.Bold);
        treeNode.SelectedImageIndex = 1;
        treeNode.Text = xmlNode.OuterXml.Trim();
    }
}

最佳答案

正如 Raymond 所建议的,您应该构建一次字体并重新使用它。我注意到,即使您这样做,更改节点字体会立即导致控件重绘,这可能导致 TreeView 除了您提供的字体之外还构建内部字体。我见过这样的情况,这会导致字体句柄使用率上升得非常快,以至于垃圾收集器无法足够快地释放它们。我认为这是 TreeView 中的一个错误,它不是很可重复,但有时会发生。使用所有应用程序的 GDI 句柄保护自己免受 Treeview 攻击的一种方法是在 TreeView.BeginUpdate() 和 TreeView.EndUpdate() 调用中包装一组节点添加或字体更改。

m_treeView.BeginUpdate();
try
{
    // TreeNode adds changes here
}
finally
{
    m_treeView.EndUpdate();
}

即使您添加或更改了多个节点,这也只会导致一次重绘。

史蒂夫

关于c# - 填充 TreeView 时出现 "Out of Memory",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21754982/

相关文章:

c# - Python 原始字符串 "r"标志在 C# 中等效

c# - .NET 任务的性能指标/诊断

windows - 如何在 Windows 机器上的 perl 脚本中将 Unicode 文件转换为 ASCII 文件

windows - 如何将 git 添加到 PATH(Windows 上的 Bash)

c# - 如何在 while 循环中声明公共(public)字符串 (C#)

c# - Moq 中 SetupSet 和 SetupProperty 的区别

c# - 有没有基于asp.net mvc的好的开源WIKI?

c++ - 在特定的 Windows DLL 模块中分配内存

c# - 如何从音频文件中获取 musicbrainz 轨道信息

node.js - 错误 : Cannot find module 'dateformat' in gulp