我有这个窗体,timer1
已启用,其间隔设置为2000毫秒。
为什么表单每2秒显示一个消息框?我的意思是当第一次定时器滴答调用UI线程将等到按下OK按钮,所以如果我不按下按钮所以不应出现另一个消息框。但它出现了!为什么呢?
我知道计时器在它自己的线程上运行,并且计时器在它的间隔上调用timer_tick函数,问题是在mbox.show()上阻止UI线程时如何显示另一个消息框?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
MessageBox.Show("test");
}
}
答案 0 :(得分:3)
这是因为您使用了MessageBox。它是一个模态对话框,用于泵送消息循环。因此仍然提供所有正常的Windows通知。喜欢油漆事件。它阻止的唯一内容是用户输入通知,鼠标和键盘。但是不是计时器消息。 Form.ShowDialog()方法也是这样工作的。
您必须自己禁用计时器。
答案 1 :(得分:2)
Timer创建自己的工作线程,它不等待OK按钮,因为它是主UI线程。
尝试以下,是否有效? (现在不能检查对不起)
private void timer1_Tick(object sender, EventArgs e)
{
timer.Stop();
MessageBox.Show("test");
timer.Start();
}
编辑:回答评论中的问题
所以如果主UI线程停在mbox.Show()为什么另一个消息框 显示?
请参阅this SO post
MessageBox.Show将在调用它的线程上显示UI。如果有 它还没有在它将设置的线程上运行的消息泵 临时的,以便运作。它会在之后撕下来 显示通话完成
答案 2 :(得分:0)
计时器在其自己的线程上工作,而不是在UI线程上,因此它不会被消息框对话框阻止。
您可以使用反射器查看其工作原理。
答案 3 :(得分:0)
显示消息框时需要停止计时器,并在框关闭时重新启动计时器:
private void timer1_Tick(object sender, EventArgs e)
{
this.timer.Stop();
DialogResult result = MessageBox.Show("test");
if (result == DialogResult.OK)
{
this.timer.Start();
}
}