我看帮助文档说这个是单线程的,但我下面试验有些不解。试验一:我timer1的Interval设为500 private void timer1_Tick(object sender, EventArgs e)
{
MessageBox.Show("test"); Thread.Sleep(2000);
}如果是单线程的,当弹出第一个"test"后,由于Thread.Sleep(2000);的阻塞,
第二个对话框应至少2秒后才能弹出,但实际上Thread.Sleep(2000);这一句加与没加的效果相同,都是500毫秒弹出一次"test"。感觉就像多线程的。可是当我改成下面后试验二: private void timer1_Tick(object sender, EventArgs e)
{
Thread.Sleep(2000);
MessageBox.Show("test");
}"test"并没弹出,而是出现窗口卡住了,这又是怎么回事呢(我用断点也不能拦到)
谢谢!
{
MessageBox.Show("test"); Thread.Sleep(2000);
}如果是单线程的,当弹出第一个"test"后,由于Thread.Sleep(2000);的阻塞,
第二个对话框应至少2秒后才能弹出,但实际上Thread.Sleep(2000);这一句加与没加的效果相同,都是500毫秒弹出一次"test"。感觉就像多线程的。可是当我改成下面后试验二: private void timer1_Tick(object sender, EventArgs e)
{
Thread.Sleep(2000);
MessageBox.Show("test");
}"test"并没弹出,而是出现窗口卡住了,这又是怎么回事呢(我用断点也不能拦到)
谢谢!
{
MessageBox.Show("test"); //系统响应messagebox消息,500ms一次
Thread.Sleep(2000); //UI线程等待。
} private void timer1_Tick(object sender, EventArgs e)
{
Thread.Sleep(2000); //UI线程等待。
MessageBox.Show("test"); //系统响应messagebox消息,2000ms一次。由于timer500ms向窗体发送一次消息,会有部分消息丢失。
}
不过不管是不是,你都应该用多线程的方式进行回答,
Control.Invoke~
{
MessageBox.Show("test"); //系统响应messagebox消息,500ms一次
Thread.Sleep(2000); //UI线程等待。
}
是不是得这样理解,Thread.Sleep(2000); 没有阻止timer500ms触发一次的事实?
如果是多线程很好理解,可是单线程的,timer的第二次难道不用等Thread.Sleep(2000); 执行完吗?
谢谢!
也就是说我要保证每个任务完整的执行完,timer才能再次触发。
我用System.Windows.Forms.Timer就是看中他的单线程式,可是试验后,我任务还没执行完,timer就触发了(也就成了多线程了)。请问如何解决。谢谢!
fncMethod()
Timer1.Enabled = True
End Sub这样MS 可以解决你说的问题
winform的timer应该基于消息的。第一种情况:messagebox也是窗体,弹出MessageBox后,消息由Messagebox处理函数处理,这时timer的到时消息传送过来,messagebox又会调用timer1_Tick,又一个messagebox产生,而且消息又转交给它,又产生一个messagbox,如此反复,所以sleep 也根本不会运行到。
第二种情况其实也一样:只不过ui线程sleep时 , 窗体失去响应,2000ms应该是太长了,还没等刷新界面,又sleep了,设的短点,应该可以看到messagebox。
你可以设一个布尔型变量,该变量标识任务是否执行完毕。然后在timer的触发事件中判断,如果任务执行完毕,就开始执行下一个事件;若没有,就不执行。这样不就可以了?