c# WinForms 可重用计时器复制事件处理程序

c# WinForms reusable timer duplicating eventhandler

我正在尝试了解计时器 class 以及与之关联的事件处理。我有一个应用程序需要根据从数据库中提取的数据在特定时间调用事件。自然计划任务不适合这个。

这是我试图理解的代码

        private Timer setTimer = new Timer();

    public Form1()
    {
        InitializeComponent();
        TimedProcess(null, null);

    }

    private void SetTimer(DateTime dtNextStop)
    {
        TimeSpan span = dtNextStop - DateTime.Now;
        int ms = (int)span.TotalMilliseconds;
        setTimer.Interval = ms;
        setTimer.Tick += new EventHandler(TimedProcess);
        setTimer.Start();
    }


    public void TimedProcess(Object sender, EventArgs e)
    {
        setTimer.Stop();
        setTimer.Dispose();
        txtLog.Text = txtLog.Text = "Tick " + DateTime.Now.ToString("HH:mm:ss") + "\r\n" + txtLog.Text;
        SetTimer(DateTime.Now.AddSeconds(4));
    }

我试图通过全局声明计时器来节省资源并在下一个时间段重用它来变得聪明(哈哈那次失败了)。 我注意到应用程序正在泄漏内存,所以我创建了一个文本框来输出滴答声。这产生了一些奇怪的结果。我显然做错了什么,将不胜感激。

Tick 18:44:50
Tick 18:44:50
Tick 18:44:50
Tick 18:44:50
Tick 18:44:50
Tick 18:44:50
Tick 18:44:50
Tick 18:44:50
Tick 18:44:46
Tick 18:44:46
Tick 18:44:46
Tick 18:44:46
Tick 18:44:42
Tick 18:44:42
Tick 18:44:38
Tick 18:44:34

问题是 SetTimer 再次附加事件处理程序,您只需要这样做一次。

你的代码有很多问题;我不确定是什么导致了您所看到的 "the problem."

对于初学者来说,您只使用了一个 Timer 对象,但显然您在每次调用 TimedProcess 时都在 Dispose()-ing 它。我强烈建议不要继续使用您已处置的对象(或者,换句话说,不要处置您打算继续使用的对象)。

接下来,每次调用 SetTimer 时,您都将注册 setTimer.Tick 事件。这可能就是为什么每次触发 Tick 事件都会看到更多行。

setTimerSystem.Timers.Timer还是System.Windows.Forms.Timer?如果是后者,它需要与控件相关联,如果是前者,您需要 Invoke 在触发计时器时对 GUI 进行更改,因为它将在后台线程上触发。