我有这段代码:
private void timer1_Tick(object sender, EventArgs e)
{
MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());
}
启用计时器,间隔= 100。
这导致无数个消息框出现在彼此之间,当我期望它们只是阻塞下一个事件直到当前消息框关闭时。
在更复杂的应用程序中,这可能导致不可预测的结果,并且好像多于1个线程可以访问相同的函数,但实际上它是相同的线程。
为什么会这样?
答案 0 :(得分:2)
消息框是一个模式对话框,用于抽取消息队列。因此,它们允许计时器刻度消息触发,因为它们被发布到GUI线程的消息队列中。
GUI线程中显示的模态对话框始终如此。由于每个线程只有一个消息队列,因此模态对话框的消息泵将拉出定时器滴答消息。
答案 1 :(得分:1)
它正是应该发生的。 tick事件由消息循环提供(除非您使用的是线程变体)并且将被重复调用,除非您以某种方式阻止消息循环(想想Thread.Sleep
或基于非消息的代码执行)。
消息框不会阻止,它只是另一个窗口,只要应用程序的消息泵正在运行,窗口就会运行,因此每次打勾都会创建并堆叠新的对话框。
快速解决此问题的方法如下:
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Stop();
MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());
timer1.Start();
}
这将停止计时器,显示一个对话框并允许计时器在关闭对话框后恢复。这意味着你只能获得一个对话框,而不是永久的堆栈。