Messagebox不会阻止windows.forms上的事件

时间:2013-02-01 19:42:59

标签: c# winforms events

我有这段代码:

    private void timer1_Tick(object sender, EventArgs e)
    {
        MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());
    }

启用计时器,间隔= 100。

这导致无数个消息框出现在彼此之间,当我期望它们只是阻塞下一个事件直到当前消息框关闭时。

在更复杂的应用程序中,这可能导致不可预测的结果,并且好像多于1个线程可以访问相同的函数,但实际上它是相同的线程。

为什么会这样?

2 个答案:

答案 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();
}

这将停止计时器,显示一个对话框并允许计时器在关闭对话框后恢复。这意味着你只能获得一个对话框,而不是永久的堆栈。