我点了button1开始一个线程.
按了这个按钮后我想按第二个按钮就按不动了..直到线程运行完了..这是为什么啊.
请高手指点一二
下面是代码:
        private void button1_Click(object sender, EventArgs e)
        {
           Thread threadParse = new Thread(new ThreadStart(RunParser));
           threadParse.Start();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show("点了第二个按钮");
        }
        delegate void GetRunParserHandle();
        void RunParser()
        {
            if (this.InvokeRequired)
            {
                GetRunParserHandle rph =
                                    new GetRunParserHandle(this.RunParser);
                this.Invoke(rph);
                return;
            }
            else
            {
                Thread.Sleep(5000);
                textBox1.Text = "5秒过了";
            }
        }

解决方案 »

  1.   

    为什么那个委托还要调用RunParser()呢?必须要这样用吗?
      

  2.   

    委托还要调用RunParser()应该是必须的吧.我想...
    我是初学线程,能帮我解决一下吗...
      

  3.   

    你可以调用其他方法来处理就可以,没必调用自己,你试一下调用其他的方法看看,那就不可卡住不动的.
    还有,this.Invoke();是同步调用
         this.BeginInvoke();就是异步了
      

  4.   

    我改成这样了.还不行..为什么? 
    void RunParser()
            {
                if (this.InvokeRequired)
                {
                    GetRunParserHandle rph =
                                        new GetRunParserHandle(this.Run);
                    this.BeginInvoke(rph);
                    return;
                }
            }        void Run()
            {
                Thread.Sleep(5000);
                textBox1.Text = "5秒过了";
            }
      

  5.   

    你怎么又是线程又是INVOKE的同时来调它,看得我有点迷糊
      

  6.   

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                CheckForIllegalCrossThreadCalls = false;
            }        private void button1_Click(object sender, EventArgs e)
            {
                Thread threadParse = new Thread(new ThreadStart(RunParser));            
                threadParse.Start();
                rph = new GetRunParserHandle(Run);
            }        private void button2_Click(object sender, EventArgs e)
            {
                MessageBox.Show("点了第二个按钮");
            }        delegate void GetRunParserHandle();
            GetRunParserHandle rph;
            void RunParser()
            {
                if (this.InvokeRequired)
                {
                    
                    rph.BeginInvoke(null,null);
                }        }        void Run()
            {
                Thread.Sleep(5000);
                textBox1.Text = "5秒过了";
            }
        }
    }
      

  7.   

    要用INVOKE,否则在线程中不能访问窗口控件
      

  8.   

    CheckForIllegalCrossThreadCalls = false;
    加上这一句就可以
      

  9.   

    Invoke的用法
    public void OnTimer(Object source, ElapsedEventArgs e)
            {
                Invoke(new EventHandle(TimerAction), source, e);
            }public void TimerAction(Object source, EventArgs e)
            {
                time2 = time2 + 1;
                labelTime.Text = time2.ToString();
            }
      

  10.   

    我看了你的代码。
    你的执行过程是UI线程->新的线程->再回到UI线程(执行你的代码).
    等于绕了一个弯回来,最后还是UI线程被等待。
      

  11.   

    RunParser修改为这个试试。void RunParser()
    {
        EventHandler eh = delegate
        {
            textBox1.Text = "5秒过了";
        };
        Thread.Sleep(5000);
        Invoke(eh);

      

  12.   

    顺便请教一下9楼:当程序运行到textBox1.Text   =   "5秒过了 "; 时出现错误:
     线程间操作无效: 从不是创建控件“textBox1”的线程访问它。
    该怎么解决呢?