本帖最后由 makewater 于 2010-05-31 23:34:02 编辑

解决方案 »

  1.   

    一行就可以了。new Thread((ThreadStart)delegate
        {
            int i = 0;
            do
            {
                this.Invoke((EventHandler)delegate
                {
                    textBox1.Text = i.ToString();
                });
            } while (++i <= 10000);
        }).Start();
      

  2.   

    出于授人渔的目的
    给你讲一下你的错误理解:
    public void DoWork()
    {
        MyInvoke mi = new MyInvoke(UpdateForm);
        this.BeginInvoke(mi, new Object[] {});
    }你的线程方法是这个,那么你这里开始,用BeginInvoke了。BeginInvoke就是发消息,插在主线程中操作的,这样你的循环也插到主线程中了。这样就没有多线程的意义了。你应该多线程操作,在需要更新界面的时候才使用Invoke方式同步一下,否则就失去线程,异步的意义了。以下是你的代码public delegate void MyInvoke();
    public void DoWork()
    {
    MyInvoke mi = new MyInvoke(UpdateForm);
    this.BeginInvoke(mi, new Object[] {});
    }
    public void UpdateForm()
    {
    int i, count = 0;
    for (i = 0; i < 10000; i++)
    {
    label1.Text = count.ToString();
    count++;
    Application.DoEvents();
    }
    }需要更换为:public delegate void MyInvoke(int count);
    public void DoWork()
    {
        MyInvoke updateUI = new MyInvoke(UpdateForm);
        for (int i = 0; i < 10000; i++)
        {
            this.Invoke(updateUI, new object[] { i });
        }
    }
    public void UpdateForm(int count)
    {
        textBox1.Text = count.ToString();
    }