簡體   English   中英

C# TreeView 從 XML 填充非常慢 - 如何讓它更快?

[英]C# TreeView populating from XML very slow - How to get it faster?

如何更快地從 XML 填充 TreeView,當我嘗試加載 ~1MB XML 文件應用程序凍結時。 我知道我需要在新線程中執行此操作,但是當我嘗試執行此操作時,即使是小文件也無法加載。 請幫忙。

private void populateTreeview()
{
    try
    {
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load(XmlFilePath);
        treeView1.Nodes.Clear();
        treeView1.Nodes.Add(new TreeNode(xDoc.DocumentElement.Name));
        TreeNode tNode = new TreeNode();
        tNode = treeView1.Nodes[0];

        addTreeNode(xDoc.DocumentElement, tNode);
    }

    catch (Exception ex){ MessageBox.Show(ex.Message); }
}

public void addTreeNode(XmlNode xmlNode, TreeNode treeNode)
{    
    XmlNode xNode;
    TreeNode tNode;
    XmlNodeList xNodeList;

    if (xmlNode.HasChildNodes)
    {
        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];
            addTreeNode(xNode, tNode);
        }
    }

    else               
        treeNode.Text = xmlNode.OuterXml.Trim();
}

這就是我試圖讓它更快地從 Task 調用函數的方式:

    public void addTreeNode(XmlNode xmlNode, TreeNode treeNode)
{    
    XmlNode xNode;
    TreeNode tNode;
    XmlNodeList xNodeList;
    if (xmlNode.HasChildNodes)
    {
        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];

            Task t = Task.Run(() => {
                BeginInvoke((System.Action)(() =>
                {
                    addTreeNode(xNode, tNode);
                }));
            });

            t.Wait();
        }
    }
    else {
                treeNode.Text = xmlNode.OuterXml.Trim();
    }

}

我要做的是在populateTreeView()方法中添加一個BeginUpdate()EndUpdate()調用。 這些調用禁用/啟用 TreeView 中的每個更改的重繪。 因此,該方法將變為:

private void populateTreeview()
{
    treeView1.BeginUpdate();
    try
    {
        ...
    }

    catch (Exception ex){ MessageBox.Show(ex.Message); }

    treeView1.EndUpdate();
}

addTreeNode()我不會嘗試addTreeNode()方法中使用任何類型的Task 請記住,除了主線程之外,您無法從其他線程更新 UI 控件,因此您必須執行調用操作,例如trevView1.Invoke(...); 這沒有太多意義。 使用Invoke調用方法將嘗試從擁有控件的線程(在我們的示例中為 TreeView)調用該方法。 因此,您的大部分更新代碼將在主線程上運行,而不是按預期的方式運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM