Windows窗体定时器与单线程应用程序

时间:2012-03-06 12:13:29

标签: .net winforms multithreading timer

我有这个窗体,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");
    }
  }

4 个答案:

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