为什么这个线程方法需要900毫秒才能完成? [英] Why does this threaded method take 900 milliseconds to complete?

查看:219
本文介绍了为什么这个线程方法需要900毫秒才能完成?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 私人无效Form1_Load的(对象发件人,发送System.EventArgs)
{
    StartToFillTree();
}

私人无效StartToFillTree()
{
    尝试
    {
        tvFolders.Nodes.Clear();
        tvFolders.Nodes.Add(新的TreeNode(加载,-1,-1));

        螺纹explorerThread =新主题(新的ThreadStart(FillTreeInAnotherThread));
        explorerThread.Start();
    }
    赶上(例外EXC)
    {
        //做抓
    }
}

私人无效FillTreeInAnotherThread()
{
    尝试
    {
        CreateTree(this.tvFolders);
    }
    赶上(例外EXC)
    {
        //做抓
    }
}


公共无效ClearTreeview(TreeView控件电视)
{
    tv.Nodes.Clear();
}

公共无效AddNodeToTreeview(TreeView的电视,树节点的节点)
{
    tv.Nodes.Add(节点);
}

公共无效CreateTree(树视图树视图)
{
    尝试
    {
        树节点hoofdNode =新树节点(NodeNam,0,0);
        AddDrivesToHoofdNode(hoofdNode); //此方法需要1毫秒

        //这部分需要905毫秒,如果我能相信我的探查!! ?? -----
        如果(treeView.InvokeRequired)
        {
            treeView.Invoke(新ClearTreeviewDelegate(this.ClearTreeview),新的对象[] {TreeView控件});
            treeView.Invoke(新AddNodeToTreeviewDelegate(this.AddNodeToTreeview),新的对象[] {树视图,hoofdNode});
        }
        其他
        {
            treeView.Nodes.Clear();
            treeView.Nodes.Add(hoofdNode);
        }
        //的900毫秒部分结束? -----


        AddFavorieteFolders(树视图); //此方法需要1毫秒

    }
    赶上(例外前)
    {
        //做一些追赶
    }
}
 

解决方案

首先,你为什么要使用线程的东西容易吗?看起来有点过度设计。但你也许不是我们展示的一切吗?

另外包装的TreeView控件修改:

  treeView.BeginUpdate();
//这里修改树。
treeView.EndUpdate();
 

要获得更好的性能。

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

解决方案

First of all, why are you using threads for something that easy? Looks a bit over-designed. But you are maybe not showing us everything?

Also wrap the TreeView modifications with:

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

To get better performance.

这篇关于为什么这个线程方法需要900毫秒才能完成?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆