如何通过线程c#将节点添加到TreeView?
我想在我的树视图中填充超过30000个多级节点 我使用这个代码来填充它,但是treeview的填充时间超过了30秒 如何使用多线程来提高填充速度 //在我的windows窗体中:如何通过线程c#将节点添加到TreeView?,c#,multithreading,treeview,C#,Multithreading,Treeview,我想在我的树视图中填充超过30000个多级节点 我使用这个代码来填充它,但是treeview的填充时间超过了30秒 如何使用多线程来提高填充速度 //在我的windows窗体中: private void ThesaurusFrm_Load(object sender, EventArgs e) { TreadPopulateTree(); } private void TreadPopulateTree() {
private void ThesaurusFrm_Load(object sender, EventArgs e)
{
TreadPopulateTree();
}
private void TreadPopulateTree()
{
System.Threading.Thread TrPopulateTree = new System.Threading.Thread(new System.Threading.ThreadStart(PopulateTree));
TrPopulateTree.Start();
}
private void PopulateTree()
{
FillTree.TvTrees = TvThesaurusNodes;
FillTree Ft = new FillTree();
var TreeItems = Db.LoadThesaurusTrees();
if (TvThesaurusNodes.InvokeRequired)
TvThesaurusNodes.BeginInvoke(new MethodInvoker(() =>
{
Ft.LoadTrees(TreeItems);
}));
}
//在我的FillTree课上
public static TreeView TvTrees;
List<TreesFieldSet> TreeItems = new List<TreesFieldSet>();
public void LoadTrees(List<TreesFieldSet> TreeItems)
{
this.TreeItems = TreeItems;
TvTrees.Nodes.Clear();
TvTrees.ShowPlusMinus = true;
TvTrees.FullRowSelect = true;
TvTrees.Nodes.Clear();
TvTrees.BeginUpdate();
LoadBaseNodes();
TvTrees.EndUpdate();
TvTrees.Refresh();
}
private void LoadBaseNodes()
{
if (TreeItems != null)
{
int BaseParent = 0;
TreeNode Node;
foreach (TreesFieldSet Tfs in TreeItems)
{
if (Tfs.ParentId < BaseParent)
BaseParent = Tfs.ParentId;
}
foreach (TreesFieldSet Tfs in TreeItems)
{
if (Tfs.ParentId == BaseParent)
{
Node = TvTrees.Nodes.Add(Tfs.Title);
Node.Tag = Tfs.TreeId;
GetChildren(Node);
}
}
}
}
private void GetChildren(TreeNode Node)
{
TreeNode ChNode = null;
Int32 nodeCat = (Int32)Node.Tag;
foreach (TreesFieldSet Tfs in TreeItems)
{
if (Tfs.ParentId == nodeCat)
{
ChNode = Node.Nodes.Add(Tfs.Title);
ChNode.Tag = Tfs.TreeId;
GetChildren(ChNode);
}
}
}
公共静态树视图TvTrees;
列表树项=新列表();
公共void加载树(列表树)
{
this.TreeItems=TreeItems;
TvTrees.Nodes.Clear();
TvTrees.ShowPlusMinus=true;
TvTrees.FullRowSelect=true;
TvTrees.Nodes.Clear();
TvTrees.BeginUpdate();
LoadBaseNodes();
EndUpdate();
TvTrees.Refresh();
}
私有void LoadBaseNodes()
{
if(TreeItems!=null)
{
int BaseParent=0;
树节点;
foreach(TreesFieldSet Tfs在TreeItems中)
{
if(Tfs.ParentId
不,永远不要使用UI执行多线程,在某些情况下,读取不是问题,但写入始终是问题
您可以延迟加载,即仅加载用户可以看到的内容,然后仅在用户单击节点时加载子节点。我已经回答了一个问题,看看这是否有帮助
通常只加载“节点”及其“直接子节点”
希望这有帮助。我同意。不要预加载30k节点。用户不会查看所有这些条目。。当用户展开节点时保持加载。然后,您应该加载该节点所有子项的子项,也就是说,您应该始终加载比可见级别多的一个级别。这样,您就可以正确显示所有子节点交叉。如果你需要一个搜索功能,它可以使用你保存在内存中的数据结构。他可能想要一个更明确的建议,反对使用多线程访问UI元素。他今天可能会倒霉。或者注意你不正确的复数。或者只是喜欢投否决票。基本的SO建议:不要介意一两次否决票@一切都很好,我不明白你的意思,也不介意你不正确的复数。你能澄清一下吗?一个孩子,两个孩子。