Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;内存不足(&Q);在填充TreeView时_C#_Windows - Fatal编程技术网

C# &引用;内存不足(&Q);在填充TreeView时

C# &引用;内存不足(&Q);在填充TreeView时,c#,windows,C#,Windows,当我使用XML填充TreeView层次结构时,我面临“内存不足”问题。我们的XML结构非常复杂,并且不是固定格式。有多个级别的子节点。我使用递归迭代XML并填充TreeView结构。我试着打电话给GC,对方付费。清除内存,但仍然抛出相同的错误。 我正在使用.NETFramework3.5的C#进行开发 如果您能帮我找到解决方案,我将不胜感激 我提供了下面的代码,用于填充树视图 private void addTreeNode(XmlNode xmlNode, TreeNode treeNode)

当我使用XML填充TreeView层次结构时,我面临“内存不足”问题。我们的XML结构非常复杂,并且不是固定格式。有多个级别的子节点。我使用递归迭代XML并填充TreeView结构。我试着打电话给GC,对方付费。清除内存,但仍然抛出相同的错误。 我正在使用.NETFramework3.5的C#进行开发

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

我提供了下面的代码,用于填充树视图

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();
    }
}
private void addTreeNode(XmlNode XmlNode,TreeNode TreeNode)
{
字符串属性=”;
treeView1.ImageList=imageList1;
treeViewResponse.ImageList=imageList1;
xmlnodexnode;
三烯醇化物;
XmlNodeList xNodeList;
foo.MoveToFollowing(XPathNodeType.Element);
namespaces1=foo.GetNamespacesInScope(XmlNamespaceScope.All);
if(xmlNode.HasChildNodes)
{
treeNode.ImageIndex=0;
treeNode.SelectedImageIndex=0;
xNodeList=xmlNode.ChildNodes;

对于(int x=0;x正如Raymond所建议的,您应该一次性构造字体并重用它。我注意到,即使您这样做,更改节点字体也会立即导致控件重新绘制,这可能会导致TreeView在您提供的字体之外构造内部字体。我看到过这样的情况,这可能会导致字体句柄丢失我认为这是TreeView中的一个bug,它不是很容易重复,但有时会发生。使用应用程序的所有GDI句柄保护自己不受TreeView影响的一种方法是在TreeView.BeginUpdate()中包装一组节点添加或字体更改和TreeView.EndUpdate()调用

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


Steve

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

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


Steve

你需要使用更少的内存。例如,不是为每个节点创建一个
新字体,而是创建一个字体并重新使用它。每个进程有10000个图形对象的限制,一个字体作为图形对象。只是遇到了这个问题。RaymondChen和@Steven Knauber的答案对我有效,但万一有人对我发现的问题感兴趣(显然这个问题至少从.NET2.0开始就存在了!)你需要使用更少的内存。例如,不是为每个节点创建一个
新字体
,而是创建一个字体并重新使用它。每个进程的图形对象限制为10000个,并且一个字体算作图形对象。刚刚遇到这个问题。RaymondChen和@Steven Knauber的答案对我有用,但万一有人感兴趣我发现(显然这个问题至少从.NET2.0开始就存在了!)这很有启发性。谢谢,兄弟!类似的“临时内存吞噬”当UI框架试图对数据库模型进行大规模更改时会发生这种情况…因此,当我知道发生了大规模更改时,我不得不关闭所有动画。这很有启发性。谢谢,兄弟!类似的“临时内存占用”当UI框架试图为数据库模型的大量更改设置动画时发生……因此,当我知道正在发生大规模更改时,我必须关闭所有动画。
m_treeView.BeginUpdate();
try
{
    // TreeNode adds changes here
}
finally
{
    m_treeView.EndUpdate();
}