我在一个winForm界面初始化时要开一个线程执行一个方法,这个方法里面有需要修改控件属性的地方,
我用如下
        private void Form1_Load(object sender, EventArgs e)
        {
            Thread t = new Thread(new ThreadStart(DoWork));
            t.Start();
            
        }        private void DoWork()
        {
            MyInvokeDelegate f = new MyInvokeDelegate(TreeBind);            tr_ServerList.Invoke(f);//这个是树型控件
        }TreeBind()这个方法是对树型控件的数据绑定,因为数据比较多,所以采取多线程,
这样虽然能出来,但是在同出来之前画面是冻结的,不能做任何操作,如果直接用线程执行方法的话又要报错,不知道哪位兄弟有好的解决办法

解决方案 »

  1.   

    用Backgroundworker类
    不阻塞主UI线程
      

  2.   


    这是因为你在LOAD事件里加载数据,
    Thread t = new Thread(new ThreadStart(DoWork));
                t.Start();
    form在等待加载数据的线程执行完成后才会显示出来,
    用Backgroundworker类也好,
    Thread d=new Thread (new ParameterizedThreadStart (DoWork))
    或是
    ThreadPool .QueueUserWorkItem (new WaitCallback (DoWork))
    意义是一样的,由于单线程单元机制等原因,.net不容许跨线程访问控件,所以最好用委托处理数据加载,
    关键是你要在Form1_Load事件里用线程异步的委托来处理,这样达到Form1先显示,又异步的加载里数据到treeview控件
      

  3.   


    他不是线程耗时,而是那个 TreeBind 方法耗时。但 TreeBind 方法有涉及到 Controls,所以只能够摆在 UI 线程。因此,此问题,我个人认为是无解的啦。或者应该从另外一个角度考虑这个问题, TreeBind 需要一次过绑定那么多数据吗。如果更新界面的方法慢到可以被感觉出来,至少也绑定时一万八千个界面元素在上面,用户一次过看得过那么多?是否可以分开,按需绑定。