代码之家  ›  专栏  ›  技术社区  ›  Run CMD

为什么这个线程方法需要900毫秒才能完成?

  •  1
  • Run CMD  · 技术社区  · 14 年前
    private void Form1_Load(object sender, System.EventArgs e)
    {
        StartToFillTree();
    }
    
    private void StartToFillTree( )
    {
        try
        {
            tvFolders.Nodes.Clear();
            tvFolders.Nodes.Add( new TreeNode("Loading", -1, -1) );
    
            Thread explorerThread = new Thread( new ThreadStart( FillTreeInAnotherThread ) );
            explorerThread.Start();
        }
        catch (Exception exc)
        {
            //Do the catch
        }
    }
    
    private void FillTreeInAnotherThread()
    {
        try
        {
            CreateTree(this.tvFolders);
        }
        catch (Exception exc)
        {
            //Do the catch
        }
    }
    
    
    public void ClearTreeview( TreeView tv ) 
    {
        tv.Nodes.Clear();
    }
    
    public void AddNodeToTreeview( TreeView tv, TreeNode node ) 
    {
        tv.Nodes.Add( node );
    }
    
    public void CreateTree(TreeView treeView)
    {
        try
        {
            TreeNode hoofdNode = new TreeNode( "NodeNam", 0, 0);
            AddDrivesToHoofdNode(hoofdNode); //This method takes 1 ms
    
            //This part takes 905 milliseconds if I can believe my profiler !!?? -----
            if( treeView.InvokeRequired )
            {
                treeView.Invoke( new ClearTreeviewDelegate( this.ClearTreeview ), new object[] { treeView } );
                treeView.Invoke( new AddNodeToTreeviewDelegate( this.AddNodeToTreeview ), new object[] { treeView, hoofdNode } );
            }
            else
            {
                treeView.Nodes.Clear();
                treeView.Nodes.Add(hoofdNode);
            }
            //End of 900ms part ?? -----
    
    
            AddFavorieteFolders(treeView);//This method takes 1 ms
    
        }
        catch (Exception ex)
        {
            //Do some catching
        }
    }
    
    4 回复  |  直到 14 年前
        1
  •  3
  •   jgauffin    14 年前

    首先,为什么你要用线程来做这么简单的事情?看起来有点设计过头了。但你可能没有给我们看所有的东西?

    还可以使用以下内容包装TreeView修改:

    treeView.BeginUpdate();
    // modify the tree here.
    treeView.EndUpdate();
    

        2
  •  8
  •   Paolo    14 年前

    不能在UI线程之外更新UI组件。所有这些调用都将更新封送回UI线程,从而有效地再次序列化应用程序。

        3
  •  3
  •   fedotoves    14 年前

    InvokeRequired需要一些时间来完成它的工作。见 this “如果控件的句柄尚未存在,则调用 向上搜索控件的父链,直到找到具有窗口句柄的控件或窗体。 如果找不到合适的句柄,InvokeRequired方法将返回false。“ 所以需要一些时间

        4
  •  2
  •   MusiGenesis    14 年前

    你在打电话吗 BeginUpdate 关于你的 TreeView EndUpdate 添加完节点后?如果你不打这些电话 将尝试在每个添加的节点后重新绘制自身-如果缺少此功能,则可能会使原本良好的代码运行得非常缓慢,特别是在添加大量节点时。