c# - 如何通过 Threads c# 将节点添加到 TreeView 中?

标签 c# multithreading treeview

我想用 >30000 个多层节点填充我的 TreeView 。

我使用这段代码来填充它,但是 treeview 需要超过 30 秒的时间来填充它。

如何使用多线程来提高填充速度?

//在我的窗体中:

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);
        }
    }
}

最佳答案

No 千万不要用UI做多线程,读在某些情况下不是问题,但写总是有问题。

您可以延迟加载,即仅加载用户可以看到的内容,然后仅在用户单击该节点时加载子节点。我已经回答了 similar question here看看是否有帮助。

通常您只加载一个“节点”及其“直接子节点”。

希望这对您有所帮助。

关于c# - 如何通过 Threads c# 将节点添加到 TreeView 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23654858/

相关文章:

c# - 可以在文件系统中保存缩略图版本吗?通常的做法是什么?

c# - HttpClient.PostAsJsonAsync 崩溃而不抛出异常

java - 如何解决线程饥饿?

c# - WPF TreeView : Skip a Level

c# - 为什么我会收到此消息 : "items collection must be empty before using itemssource" in a treeview?

c# - 是否有一行代码可以获取该字符串的特定部分?

c# - 我可以使用带有 params 关键字的 lambda 表达式吗?

java - 如何有效取消周期性ScheduledExecutorService任务

multithreading - 子线程看不到主线程所做的更新

wpf - TreeView.IsSelected 触发器无法正常工作