ProcessBox在ui线程打开也要在ui线程关闭        public void ThreadControl()         {
            this.BeginInvoke(new EventHandler(delegate
            {
                ProcessBox.getProcessBox().Close();   
            }));
        }

解决方案 »

  1.   

    this.BeginInvoke(new EventHandler(delegate
                {
                    ProcessBox.getProcessBox().Close();   
                }));
    是又开启一个线程??那现在不是有3个线程了?
      

  2.   

    BeginInvoke和Invoke都并非真正意义上的异步执行,你可以打个日志看一下
      

  3.   

    什么意思?BeginInvoke不是开启一个线程的意思吗?
    所以我的....数据查询过程代码....才是应该用Thread th=new Thread(数据查询函数) 这种方式来开启线程是吗?
      

  4.   

    我之前一直是做C++,最近公司有个C#案子让我接收,所以对c#委托还不是很理解
    到底是Thread th=new Thread(thread_fun)这种方式开启线程
    还是用BeginInvoke这种方式开启线程啊
      

  5.   

    windows GUI编程有一个规则,只能通过创建控件的线程来操作控件的数据,如果从线程外操作windows窗体控件,Control类实现了ISynchronizeInvoke接口,提供了Invoke和BeginInvoke方法来让其它线程更新GUI界面控件。
      

  6.   

    所以我的....数据查询过程代码....是应该用Thread th=new Thread(数据查询函数) 这种方式来开启线程
    还是用委托的BeginInvoke方法来开启线程啊?
      

  7.   

    我明白你为什么搞不明白了,这里有两个概念一个是control的Invoke和BeginInvoke,另一个是delegate的Invoke和BeginInvoke,这两个是不同的概念,前者是ui线程提供的更新控件的方法,后者是操作线程池。我刚才说的都是前者,所以别和你自己的搞混。
      

  8.   

    为什么一定要弹出一个模态窗口呢,你加个控件到datagridview控件里多方便啊
      

  9.   

    好吧,那delegate的Invoke和BeginInvoke 和Thread th=new Thread(thread_fun)都是用来开启线程的吧?
      

  10.   

    怎么说??什么意思?
    我就是想实现等待数据查询的时候,会有那种ProcessBox让人看见,以免让用户因为数据还没有查询出来,而以为界面卡死了
      

  11.   

    怎么说??什么意思?
    我就是想实现等待数据查询的时候,会有那种ProcessBox让人看见,以免让用户因为数据还没有查询出来,而以为界面卡死了我明白你的需求,你加一个控件到datagridview里用于显示等待信息,需要的时候让它出来,不需要时就隐藏和删除它,很简单的
      

  12.   

    刚从C++转C#。datagridview这个控件还不是很熟啊,有木有demo
      

  13.   

    这和datagridview控件没关系,其它控件也可以这么做 .controls.add(xxxx)
      

  14.   

    所以我还是得弹出个模态Form是吧?
    “关闭主窗体中用ShowDialog打开的子窗体”这个问题解决了
    我在研究“那delegate的Invoke和BeginInvoke 和Thread th=new Thread(thread_fun)都是用来开启线程的吧”这个问题
      

  15.   

    我加了代码试过了   private void button1_Click(object sender, EventArgs e)
            {
                
                CrossThreadControl hander = new CrossThreadControl(ThreadControl);
                hander.BeginInvoke(new AsyncCallback(writeComplete), null);
                ProcessBox.getProcessBox().ShowDialog();
               
            }        private void writeComplete(IAsyncResult reslut)
            {
                CrossThreadControl handler = (CrossThreadControl)((AsyncResult)reslut).AsyncDelegate;
                handler.EndInvoke(reslut);
            }        public void ThreadControl()
            {
                this.Invoke(new CrossThreadControl(delegate
                {
                    ProcessBox.getProcessBox().SetText("aaaa");
                }));
                int num = 0;
                for (int n = 0; n < 100000; n++)
                {
                    for (int m = 0; m < 10000; m++)
                    {
                        num++;
                    }
                }
                this.Invoke(new CrossThreadControl(delegate
                    {
                        ProcessBox.getProcessBox().Close();
                    }));
                         
            }用你说的方法果断好了,马上给分
      

  16.   

    其实我先说为什么不用timer?这个不是很简单吗?