日期:2014-05-18  浏览次数:20781 次

请问,在UI线程之外的线程访问控件
public delegate void InvokeDelegate(); //创建一个委托
private void button6_Click(object sender, EventArgs e)
  {
  Thread thread = new Thread(InvokeMethod);
  thread.Start();
  MessageBox.Show("gggg");  
  }
public void InvokeMethod()  
  {
  if (this.InvokeRequired)
  {
  this.BeginInvoke(new InvokeDelegate(AddItem));  
  }
  }
private void AddItem()
  {
  textBox1.Text = "熊俊";
  Thread.Sleep(5000);
  }


我的问题,在AddItem方法中,挂起5秒,在这5秒之内,MessageBox.Show("gggg");这一句应该执行吧,为什么没有执行呢?而是等到5秒之后才执行?

------解决方案--------------------
AddItem 被 this.BeginInvoke 切换到主线程执行,与 MessageBox.Show("gggg"); 在同一个线程里了,就有了先后。
------解决方案--------------------
楼上有理。
------解决方案--------------------

this.BeginInvoke(new InvokeDelegate(AddItem)); 
虽然是异步但是无关紧要,你是在当前this UI上执行的委托方法,无非还是要使用UI线程,
msgBox也是UI线程,所以先后了

但是也可能MessageBox.Show("gggg"); 先,但不管怎样 都是有先后
------解决方案--------------------
你这里的BeginInvoke内执行的方法是排队到UI线程上触发的,而不是UI线程之外,因此你让UI等到5秒后,那个MessageBox.Show才能被执行。
------解决方案--------------------
探讨

引用:

AddItem 被 this.BeginInvoke 切换到主线程执行,与 MessageBox.Show("gggg"); 在同一个线程里了,就有了先后。

可是有个问题哦,代码中是MessageBox.Show("gggg");5秒钟后才执行,
可是如果把MessageBox.Show("gggg"); 换成: textBox3.Text = "刘德华"……

------解决方案--------------------
子线程的方法被委托给主线程中去执行,
子线程启动后,还没有执行到MessageBox() 委托就开始执行了 
主线程接管了委托方法的运行 此时 委托方法和弹出框位于同一个线程内(主线程),
所以又编程顺序执行了
------解决方案--------------------
探讨

引用:

引用:

引用:

AddItem 被 this.BeginInvoke 切换到主线程执行,与 MessageBox.Show("gggg"); 在同一个线程里了,就有了先后。

可是有个问题哦,代码中是MessageBox.Show("gggg");5秒钟后才执行,
可是如果把MessageBox.Show("g……