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

时间:2015-02-13 18:48:19

标签: c# timer eventhandler

我试图理解计时器类和与之关联的事件处理。我有一个应用程序,需要根据从数据库中提取的数据在特定时间调用事件。自然安排的任务不适合这个。

这是我想要了解的代码

        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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

你的代码有很多问题;我不确定是什么导致了你所看到的“问题。”

首先,您只使用一个Timer对象,但显然是Dispose() - 每次调用TimedProcess时都会这样做。我强烈建议不要继续使用你已经处置的对象(换句话说,不要处置你打算继续使用的对象)。

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

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