System.Windows.Forms.Timer And MessageBox

本文关键字:And MessageBox Timer Forms Windows System | 更新日期: 2023-09-27 18:29:30

有人能告诉我为什么System.Windows.Forms.Timer继续显示多个消息框吗?我以为它在GUI线程上。。。因此在第一个消息框之后,GUI线程应该阻塞。但并非如此

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

    }
    int nValue = 0;
    void tmr_Tick(object sender, EventArgs e)
    {
        nValue++;
        MessageBox.Show(nValue.ToString());
    }
    System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer();
    private void btnStartTimer_Click(object sender, EventArgs e)
    {            
        tmr.Interval = 500;
        tmr.Enabled = true;
        tmr.Tick += new EventHandler(tmr_Tick);
    }
}

System.Windows.Forms.Timer And MessageBox

MessageBox.Show()方法包括(与所有模式对话框一样)一个消息循环,该循环继续泵送窗口消息。

窗口消息允许窗口与用户交互(更新自身、接受输入等),也允许Forms.Timer类工作。

如果希望在显示对话框时Forms.Timer停止计时,则需要在显示对话框之前将计时器的Enabled属性设置为false

在Tick事件中,停止计时器,然后在MessageBox.Show之后再次启动,如:

void tmr_Tick(object sender, EventArgs e)
{
    tmr.Enabled = false;
    nValue++;
    MessageBox.Show(nValue.ToString());
    tmr.Enabled = true; 
}

您收到重复的MessgeBoxes的原因是,您的计时器在显示第一个MessageBox后仍在继续。

消息框不会阻止GUI线程。就这么简单。您可以与消息框交互,毕竟:)

此外:计时器的内部工作方式尚不清楚,但我猜它在另一个线程上运行,只是在GUI线程上返回。