请问,在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才能被执行。
------解决方案--------------------
------解决方案--------------------子线程的方法被委托给主线程中去执行,
子线程启动后,还没有执行到MessageBox() 委托就开始执行了
主线程接管了委托方法的运行 此时 委托方法和弹出框位于同一个线程内(主线程),
所以又编程顺序执行了
------解决方案--------------------