一行就可以了。new Thread((ThreadStart)delegate { int i = 0; do { this.Invoke((EventHandler)delegate { textBox1.Text = i.ToString(); }); } while (++i <= 10000); }).Start();
出于授人渔的目的 给你讲一下你的错误理解: 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(); }
{
int i = 0;
do
{
this.Invoke((EventHandler)delegate
{
textBox1.Text = i.ToString();
});
} while (++i <= 10000);
}).Start();
给你讲一下你的错误理解:
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();
}