System.Windows.Forms.Timer和MessageBox

时间:2014-11-06 17:33:35

标签: c# winforms timer

有人可以告诉我为什么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);
    }
}

3 个答案:

答案 0 :(得分:4)

MessageBox.Show()方法包括(如所有模态对话框一样)一个消息循环,继续抽取窗口消息。

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

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

答案 1 :(得分:2)

在Tick事件中停止计时器,然后在MessageBox.Show之后重新开始:

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

您重复使用MessgeBoxes的原因是因为您的计时器在显示第一个MessageBox后仍在继续。

答案 2 :(得分:1)

消息框不会阻止GUI-Thread。它就这么简单。毕竟,您可以与消息框进行交互:)

另外:计时器的内部工作原理并不清楚,但我猜它会在另一个线程上运行而只返回GUI-Thread。