我有一个Form里边有一个TreeView需要调用数据库来更新数据.
每次打开Form都很慢.
我想做一个线程,先让Form显示出来,然后再慢慢更新TreeView.但是怎么也不能成功
因为代码比较多,我用一个Label来代替.
区别在于这个Label如果不使用代理可以完成我要的功能,但TreeView会提示
"在该控件上执行的操作正从错误的线程调用。使用 Control.Invoke 或 Control.BeginInvoke 封送到正确的线程才能执行此操作。"
后来使用代理.但结果是和没有使用多线程的效果一样.
代码如下.        public main1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
            new Thread(new ThreadStart(SetLabel)).Start();        }
        delegate void setLabelDelegate();        private void SetLabel()
        {
            this.Invoke(new setLabelDelegate(setLabel));
        }
        private void setLabel()
        {
            Thread.Sleep(6000);
            label1.Text = "设置成功!";
        }

解决方案 »

  1.   

    TTreeView必须要通过委托函数来更新数据,仅仅只是用来更新数据的,你不应该在代理函数中执行长时间操作
    比如你的那句 Thread.Sleep(6000);改成这样就行了delegate void setLabelDelegate();        private void SetLabel()
            {
                Thread.Sleep(6000);
                this.Invoke(new setLabelDelegate(setLabel));
                
            }
            private void setLabel()
            {
                label1.Text = "设置成功!";
            }
      

  2.   

    TTreeView必须要通过委托函数来更新数据,仅仅只是用来更新数据的,你不应该在代理函数中执行长时间操作
    比如你的那句 Thread.Sleep(6000);改成这样就行了delegate void setLabelDelegate();        private void SetLabel()
            {
                Thread.Sleep(6000);
                this.Invoke(new setLabelDelegate(setLabel));
                
            }
            private void setLabel()
            {
                label1.Text = "设置成功!";
            }