0

我在 Windows 窗体(C# 3.0、.net 3.5 SP1、VS2008 SP1、Vista)上有一个计时器,即使它停止后似乎也能工作。代码是:

using System;
using System.Windows.Forms;

namespace TestTimer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            StartTimer();
        }

        private DateTime deadline;

        private void StartTimer()
        {
            deadline = DateTime.Now.AddSeconds(4);
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            int secondsRemaining = (deadline - DateTime.Now).Seconds;

            if (secondsRemaining <= 0)
            {
                timer1.Stop();
                timer1.Enabled = false;
                MessageBox.Show("too slow...");
            }
            else
            {
                label1.Text = "Remaining: " + secondsRemaining.ToString() + (secondsRemaining > 1 ? " seconds" : " second");
            }
        }
    }
}

即使在调用 timer1.Stop() 之后,我仍会继续在屏幕上接收 MessageBoxes。当我按 esc 时,它停止了。但是,我预计只会出现一个消息框......我还应该做什么?添加 timer1.Enabled = false 不会改变行为。

谢谢

4

3 回答 3

5

我可能错了,但 MessageBox.Show() 是阻塞操作(等待您关闭对话框)吗?如果是这样,只需将 Show() 调用移到 Stop/Enabled 行之后?

于 2009-02-26T11:28:28.993 回答
1

这里可能有几个因素在起作用。

模态 MessageBox.Show() 可以阻止计时器停止生效,直到它被解除(正如布赖恩指出的那样)。

timer1_Tick 可以在后台线程上执行。UI 调用(例如 MessageBox.Show() 和后台线程不能混合使用。

这两个问题都可以通过使用 BeginInvoke 调用显示消息框的方法来解决。

于 2009-02-26T12:03:51.827 回答
1

请注意,以下内容是不必要的:

            timer1.Stop();
            timer1.Enabled = false;

Stop()是一样的Enabled=false。和Start()是一样的Enabled=true

http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.enabled.aspx

于 2011-07-27T01:07:17.020 回答