请问,在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才能被执行。
[解决办法]