我试图理解计时器类和与之关联的事件处理。我有一个应用程序,需要根据从数据库中提取的数据在特定时间调用事件。自然安排的任务不适合这个。
这是我想要了解的代码
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
答案 0 :(得分:2)
问题是SetTimer
再次附加事件处理程序,您只需要执行一次。
答案 1 :(得分:1)
你的代码有很多问题;我不确定是什么导致了你所看到的“问题。”
首先,您只使用一个Timer
对象,但显然是Dispose()
- 每次调用TimedProcess
时都会这样做。我强烈建议不要继续使用你已经处置的对象(换句话说,不要处置你打算继续使用的对象)。
接下来,每次调用setTimer.Tick
时,您都会注册SetTimer
个事件。这可能就是为什么你会在每次Tick
事件发生时看到更多行。
setTimer
是System.Timers.Timer
还是System.Windows.Forms.Timer
?如果是后者,则需要与控件关联,如果是前者,则需要在触发计时器时对GUI进行Invoke
更改,因为它将在后台线程上触发。 / p>