我的应用始终正在运行以更新记录。我有通过电子邮件发送excel文件的功能。它会在我每天设置的时候发送。所以我使用计时器方法。它可以解雇我的功能。我设置的定时器间隔是100.假设时钟现在是10.00 PM,如果在数据库中相同,那么将触发sendMail函数。
但现在问题是,计时器会不止一次激活我的功能,我认为大约有10次或更少。我只是只想火一次。我应该使用最佳方式是什么?
// 0 is off and 1 is on
int on_off = int.Parse(class_ta.getValue("tbl_setting", "value", "name", "onOffMail"));
if (on_off == 1)
{
DataTable dtSendTime = class_ta.valueTimeSend(0);
foreach (DataRow row in dtSendTime.Rows)
{
DateTime dtFire = DateTime.Parse(row["sendTime"].ToString());
TimeSpan tsHour = TimeSpan.Parse(dtFire.Hour.ToString());
TimeSpan tsMinutes = TimeSpan.Parse(dtFire.Minute.ToString());
if (tsHour == TimeSpan.Parse(DateTime.Now.TimeOfDay.Hours.ToString()) && tsMinutes == TimeSpan.Parse(DateTime.Now.TimeOfDay.Minutes.ToString()) && 0 == int.Parse(DateTime.Now.TimeOfDay.Seconds.ToString()))
{
sendMail();
}
}
}
希望有人能帮我解决这个问题,谢谢。
答案 0 :(得分:2)
一旦您的活动被解雇,您就可以将Enabled
字段设置为false
。
timer.Enabled = false;
您也可以通过调用
来停止计时器timer.Stop(); // sets timer.Enabled to false
修改强>
另一种可能性是简单地增加计时器的间隔
timer.Interval = 1000;
这样您就不需要一直禁用/重新启用计时器。
答案 1 :(得分:2)
一旦发射计时器就立即停止计时器。
timer1.Stop();
或
timer1.Enabled = false;
将此作为Tick事件中的第一行。
答案 2 :(得分:1)
我无法通过您的代码告诉您有关计时器的任何信息,所以这是猜测,但您可以尝试将以下内容作为计时器tick
事件中的第一行代码:
myTimer.Stop();
答案 3 :(得分:1)
只需将间隔时间从100更改为1000。
您的电子邮件功能会在一秒钟内触发10次。
答案 4 :(得分:1)
正如他们总是说的那样,不要重新发明轮子。而不是让您的应用程序始终运行,为什么不从Windows任务计划程序启动它?这样,您就可以从应用中删除所有计时器和日程安排代码,并让它专注于在启动时发送电子邮件。
或者,如果您需要按数据库中的内容控制计划,我会在数据库中设置一些信息,以表明电子邮件已发送。
如果每行只需要发送一封电子邮件,请在表中添加IsSent
列,默认为0.查询表时,请在WHERE子句中使用:
WHERE IsSent = 0
AND sendTime <= GetDate()
然后您知道返回的任何行都是需要发送现在的电子邮件的行。对于每个电子邮件,请发送电子邮件,然后将该行的IsSent
列更新为1。
如果每行需要在每天的特定时间发送电子邮件,请在表中添加LastSentTime
列,默认为NULL。
WHERE (@LastSentTime IS NULL OR DateDiff(day, @LastSentTime, GetDate()) > 0)
AND @SendTime-DATEADD(day,DATEDIFF(day,0,@SendTime),0) < GetDate()-DATEADD(day,DATEDIFF(day,0,GetDate()),0)
对于每个人,发送电子邮件,然后将该行的LastSentTime
更新为当前时间。