想用子线程控制窗体中一个panel的显示,panel中有一个滚动条,看代码Thread th = new Thread(new ThreadStart(ThreadProcess));
th.Start();
string serverdata = FileService.GetQueryData(UserName, PassWord, "上传日期", true, condition, folderKey, pagesize, 1, out toNum, out ds);其中serverdata获取需要比较长的时间,我想在它之前先显示panel,ThreadProcess对应如下:        private void ThreadProcess()
        {
            MyInvoke mi = new MyInvoke(ProcessShow);
            BeginInvoke(mi);
        }        private delegate void MyInvoke();        private void ProcessShow()
        {
            this.panel3.Show();
        }我这样写应该没有问题吧,但是为什么还是在serverdata完全执行完成之后panel才显示,求教原因及解决方案!

解决方案 »

  1.   

    用事件处理,
    把多线程处理部分封装到一个类中,该类向外提供处理进度的事件,
    UI部分响应该事件
    代码结构大致如下:
    class Worker
    {
     Thread..
     event ..
     void Start()
     {
       //引发事件
     }
    }UI:
    Worker work = new Worker();
    work.onevent ++ ..void execevent()
    {
     Invoke(..);//在UI中响应线程引发的事件需要使用回调方式
      

  2.   


            private void ThreadProcess()
            {
                ProcessShow();
            }        private void ProcessShow()
            {
                if (this.panel3.InvokeRequired)
                {
                    this.Invoke(new MethodInvoker(delegate { ProcessShow(); }));
                    return;
                }
                this.panel3.Show();
            }
      

  3.   

    调换下位置呗..
    你把string serverdata = FileService.GetQueryData(UserName, PassWord, "上传日期", true, condition, folderKey, pagesize, 1, out toNum, out ds);
    放在th线程里面.把 this.panel3.Show();
    放在主线程里.
      

  4.   

    是这样的,得到serverdata 后还得进行界面的更新操作呢!
      

  5.   

    用 BackgroundWorker 轻松简单快捷;比异步委托简单得多 
      

  6.   

    我觉得是这样的
    private void ThreadProcess()
            {
                MyInvoke mi = new MyInvoke(ProcessShow);
                BeginInvoke(mi);
            }
    BeginInvoke相当于this.BeginInvoke,this是UI窗口的实例,所以,实际上,你的show还是在UI线程上执行的
    正如benyouyong所说,调换一下位置,在子线程中读取数据,在UI线程中控制UI的元素