0

我的应用程序一直在运行以更新记录。我有用电子邮件发送 excel 文件的功能。它将在我每天设置的时间发送。所以我使用计时器方法。它可以触发我的功能。我将计时器间隔设置为 100。假设现在的时钟是晚上 10 点,如果在数据库中相同,那么它将触发 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();
        }
    }
}

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

4

5 回答 5

2

您可以在事件触发后立即将该Enabled字段设置为 。false

timer.Enabled = false;

您也可以通过调用停止计时器

timer.Stop(); // sets timer.Enabled to false

资料来源:MSDN

编辑:

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

timer.Interval = 1000;

这样您就不需要一直禁用/重新启用计时器。

于 2013-03-06T15:06:20.377 回答
2

定时器一触发就停止。

timer1.Stop();

或者

timer1.Enabled = false;

将此作为 Tick 事件的第一行。

于 2013-03-06T15:08:09.107 回答
1

我无法从您的代码中告诉任何有关您的计时器的信息,所以这是一个猜测,但您可以尝试在计时器tick事件中包含以下代码作为第一行代码:

myTimer.Stop();
于 2013-03-06T15:07:10.180 回答
1

只需将您的间隔时间从 100 更改为 1000。

您在一秒钟内触发您的电子邮件功能 10 次。

于 2013-03-06T15:23:18.593 回答
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将该行的更新为当前时间。

于 2013-03-06T15:36:28.307 回答