使用计时器来触发功能

时间:2013-03-06 15:04:17

标签: c# timer

我的应用始终正在运行以更新记录。我有通过电子邮件发送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();
        }
    }
}

希望有人能帮我解决这个问题,谢谢。

5 个答案:

答案 0 :(得分:2)

一旦您的活动被解雇,您就可以将Enabled字段设置为false

timer.Enabled = false;

您也可以通过调用

来停止计时器
timer.Stop(); // sets timer.Enabled to false

Source: MSDN

修改

另一种可能性是简单地增加计时器的间隔

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更新为当前时间。