[英]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.