title: Large size XML elements to TreeView control
body: <p>I am populating TreeView control with XML elements. </p>
  
  <p>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: </p>
  
  <pre><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)(() =&gt; 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 &lt;= 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();
      }
  }
  </code></pre>
  
  <p>Thanks a lot for all your help! :) </p>
  
  <p><strong>--EDIT--</strong></p>
  
  <p>I tried to do this with backgroundWorker, but I get:</p>
  
  <blockquote>
    <p>"InvalidOperationException - Action being performed on this control is
    being called from the wrong thread"</p>
  </blockquote>
  
  <p>This is what I'm trying:</p>
  
  <pre><code>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 &lt;= 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();
      }
  }
  </code></pre>