I am populating TreeView control with XML elements.
This method works perfectly fine. But my problem is if the XML file size reached 20MB+, my application freezes. Can someone help me to optimize my code:
public void PopulateTreeView(string xmlPath)
{
    try
    {
        var settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, XmlResolver = null };
        var doc = new XmlDocument();
        using (var sr = new StreamReader(xmlPath))
        {
            using (var reader = XmlReader.Create(sr, settings))
            {
                doc.Load(reader);
                //Initialize the TreeView control.
                treeView1.Nodes.Clear();
                treeView1.Invoke((MethodInvoker)(() => treeView1.Nodes.Add(new TreeNode(doc.DocumentElement.Name)))); 
                TreeNode tNode = new TreeNode();
                tNode = treeView1.Nodes[0];
                // Populate the TreeView with the DOM nodes.
                AddNode(doc.DocumentElement, tNode);
            }
        }
    }
    catch (XmlException xmlEx)
    {
        MessageBox.Show(xmlEx.Message, Path.GetFileName(xmlPath));
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
private void AddNode(XmlNode inXmlNode, TreeNode inTreeNode)
{
    XmlNode xNode;
    TreeNode tNode;
    XmlNodeList nodeList;
    int i;
    // Loop through the XML nodes until the leaf is reached.
    // Add the nodes to the TreeView during the looping process.
    if (inXmlNode.HasChildNodes)
    {
        nodeList = inXmlNode.ChildNodes;
        for (i = 0; i <= nodeList.Count - 1; i++)
        {
            xNode = inXmlNode.ChildNodes[i];
            inTreeNode.Nodes.Add(new TreeNode(xNode.Name));
            tNode = inTreeNode.Nodes[i];
            AddNode(xNode, tNode);
        }
    }
    else
    {
        inTreeNode.Text = (inXmlNode.OuterXml).Trim();
    }
}
Thanks a lot for all your help! :)
--EDIT--
I tried to do this with backgroundWorker, but I get:
"InvalidOperationException - Action being performed on this control is being called from the wrong thread"
This is what I'm trying:
private void frmMain_Load(object sender, EventArgs e)
{
    if (!backgroundWorker.IsBusy)
        backgroundWorker.RunWorkerAsync();
}
private void backgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    if (worker.CancellationPending)
    {
        e.Cancel = true;
    }
    else
    {
        try
        {
            // SECTION 1. Create a DOM Document and load the XML data into it.
            var settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, XmlResolver = null };
            var doc = new XmlDocument();
            using (var sr = new StreamReader(_xmlPath))
            {
                using (var reader = XmlReader.Create(sr, settings))
                {
                    doc.Load(reader);
                    // SECTION 2. Initialize the TreeView control.
                    treeView1.Nodes.Clear();
                    treeView1.Nodes.Add(new TreeNode(doc.DocumentElement.Name));
                    TreeNode tNode = new TreeNode();
                    tNode = treeView1.Nodes[0];
                    // SECTION 3. Populate the TreeView with the DOM nodes.
                    AddNode(doc.DocumentElement, tNode);
                    //treeView1.ExpandAll();
                }
            }
        }
        catch (XmlException xmlEx)
        {
            MessageBox.Show(xmlEx.Message, Path.GetFileName(_xmlPath));
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}
public void AddNode(XmlNode inXmlNode, TreeNode inTreeNode)
{
    XmlNode xNode;
    TreeNode tNode;
    XmlNodeList nodeList;
    int i;
    // Loop through the XML nodes until the leaf is reached.
    // Add the nodes to the TreeView during the looping process.
    if (inXmlNode.HasChildNodes)
    {
        nodeList = inXmlNode.ChildNodes;
        for (i = 0; i <= nodeList.Count - 1; i++)
        {
            xNode = inXmlNode.ChildNodes[i];
            inTreeNode.Nodes.Add(new TreeNode(xNode.Name));
            tNode = inTreeNode.Nodes[i];
            AddNode(xNode, tNode);
        }
    }
    else
    {
        // Here you need to pull the data from the XmlNode based on the
        // type of node, whether attribute values are required, and so forth.
        inTreeNode.Text = (inXmlNode.OuterXml).Trim();
    }
}
 
     
    