请问,在UI线程之外的线程访问控件

dft43gv43 2012-05-31 10:30:02
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秒之后才执行?
...全文
112 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
__天涯寻梦 2012-05-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 6 楼 的回复:

引用 5 楼 的回复:

引用 1 楼 的回复:

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

可是有个问题哦,代码中是MessageBox.Show("gggg");5秒钟后才执行,
可是如果把MessageBox.Show("g……
[/Quote]
thread.Start 后,要过一小小会,才会切换到主线程,这一小小会内主线程可能已经执行到了 textBox3.Text ,但是 MessageBox.Show 是个复杂的过程,与主线程有一系列的消息传递,this.BeginInvoke 也是向主线程发送消息来执行,一般来说 Invoke 的消息会先到,所以先执行了。
dft43gv43 2012-05-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

引用 1 楼 的回复:

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

可是有个问题哦,代码中是MessageBox.Show("gggg");5秒钟后才执行,
可是如果把MessageBox.Show("gggg"); 换成: textB……
[/Quote]
你上面不是说的,切换到主线程执行,与textBox3.Text = "刘德华"; 在同一个线程里吗?因而有了先后顺序,
既然有先后属性,那就的应该Start执行完之后,才能执行啊,怎么能随便快呢?
裸奔的蜗牛 2012-05-31
  • 打赏
  • 举报
回复
子线程的方法被委托给主线程中去执行,
子线程启动后,还没有执行到MessageBox() 委托就开始执行了
主线程接管了委托方法的运行 此时 委托方法和弹出框位于同一个线程内(主线程),
所以又编程顺序执行了
__天涯寻梦 2012-05-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 1 楼 的回复:

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

可是有个问题哦,代码中是MessageBox.Show("gggg");5秒钟后才执行,
可是如果把MessageBox.Show("gggg"); 换成: textBox3.Text = "刘德华"……
[/Quote]
MessageBox.Show 比 textBox3.Text 要多做很多准备工作,而且打开窗体也有线程操作在里面,所以会在之后执行,而 textBox3.Text 就重绘下界面,速度非常快,快过 thread.Start 的准备时间,所以先执行了。
dft43gv43 2012-05-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

AddItem 被 this.BeginInvoke 切换到主线程执行,与 MessageBox.Show("gggg"); 在同一个线程里了,就有了先后。
[/Quote]
可是有个问题哦,代码中是MessageBox.Show("gggg");5秒钟后才执行,
可是如果把MessageBox.Show("gggg"); 换成: textBox3.Text = "刘德华"; 怎么一下子就执行了呢,而不是在5秒钟之后才执行的

请指教...
qldsrx 2012-05-31
  • 打赏
  • 举报
回复
你这里的BeginInvoke内执行的方法是排队到UI线程上触发的,而不是UI线程之外,因此你让UI等到5秒后,那个MessageBox.Show才能被执行。
蔡袅 2012-05-31
  • 打赏
  • 举报
回复

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

但是也可能MessageBox.Show("gggg"); 先,但不管怎样 都是有先后
天下如山 2012-05-31
  • 打赏
  • 举报
回复
楼上有理。
__天涯寻梦 2012-05-31
  • 打赏
  • 举报
回复
AddItem 被 this.BeginInvoke 切换到主线程执行,与 MessageBox.Show("gggg"); 在同一个线程里了,就有了先后。

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧