Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过线程c#将节点添加到TreeView?_C#_Multithreading_Treeview - Fatal编程技术网

如何通过线程c#将节点添加到TreeView?

如何通过线程c#将节点添加到TreeView?,c#,multithreading,treeview,C#,Multithreading,Treeview,我想在我的树视图中填充超过30000个多级节点 我使用这个代码来填充它,但是treeview的填充时间超过了30秒 如何使用多线程来提高填充速度 //在我的windows窗体中: private void ThesaurusFrm_Load(object sender, EventArgs e) { TreadPopulateTree(); } private void TreadPopulateTree() {

我想在我的树视图中填充超过30000个多级节点

我使用这个代码来填充它,但是treeview的填充时间超过了30秒

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

//在我的windows窗体中:

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建议:不要介意一两次否决票@一切都很好,我不明白你的意思,也不介意你不正确的复数。你能澄清一下吗?一个孩子,两个孩子。