1.加了Application.DoEvents();这句。效果是第一幅图,,不加的时候效果是第二幅图!!!大神们请问是什么情况呀!!
2.Application.DoEvents();msdn解释 是处理当前在消息队列中的所有 Windows 消息
那怎样在调试的时候查看消息队列中包含了哪些windows消息??
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
this.Load += new EventHandler(Form3_Load);
}
void Form3_Load(object sender, EventArgs e)
{
Thread tr = new Thread(new ThreadStart(DO));
tr.Start();
}
private void DO()
{
this.Invoke(new Action(() =>
{
this.textBox1.Text = "C#";
Application.DoEvents();
Thread.Sleep(3000);
}));
}
}
windows应该有个消息队列的吧
怎样解释这种情况呢??能否告知??谢了
触发消息队列中排队的消息。
上面这种情况你能解释是什么原因嘛???
@彬彬@科比: 为什么有一个窗体会出现加载不出控件呢。因为load事件里面调用了一个线程,而这个线程中调用了this.Invoke()。这个方法将Thread.Sleep(3000)停顿的效果发给的主窗体form的线程,导致form线程暂停。所以load事件会停3秒,然后再开始加载.
但如果你修改do方法为如下,就不会等待3秒
private void DO()
{
this.Invoke(new Action(() =>
{
this.textBox1.Text = "C#";
}));
Application.DoEvents();
Thread.Sleep(3000);
}
@滴答的雨: 可能我说的不是很清楚。。两个都线程停顿了三秒的。。我是想问为什么 去掉了Application.DoEvents();连控件都出不来了???
@彬彬@科比:
1、我想说的等待3秒是说要不要等待3秒再加载控件。
2、我上面想回答的效果是这样的:
a、主线程执行load方法。
b、辅助线程开始执行Invoke,但是Invoke会将消息转给主线程由主线程执行。
c、此时主线程消息队列有两个事情,加载控件,设置控件的Text值再Sleep(3000)
d、DoEvents()就是告诉在Sleep(3000)之前,先看看有没有别的消息还没执行完,这里就是加载控件,先执行完加载再Sleep(3000).没有DoEVent()即执行完Sleep(3000)后再继续执行加载控件,所以现在控件会等待3秒再呈现出来
1、我想说的等待3秒是说要不要等待3秒再加载控件。
2、我上面想回答的效果是这样的:
a、主线程执行load方法。
b、辅助线程开始执行Invoke,但是Invoke会将消息转给主线程由主线程执行。
c、此时主线程消息队列有两个事情,加载控件,设置控件的Text值再Sleep(3000)加盟网www.30jm.com加盟网
d、DoEvents()就是告诉在Sleep(3000)之前,先看看有没有别的消息还没执行完,这里就是加载控件,先执行完加载再Sleep(3000).没有DoEVent()即执行完Sleep(3000)后再继续执行加载控件,所以现在控件会等待3秒再呈现出来
你可以试试:
BeginInvoke(new MethodInvoker(delegate
{
this.textBox1.Text = "C#";
}));