簡體   English   中英

每24小時C#計時器間隔

[英]C# Timer Interval Every 24 Hours

我正在學習如何創建將在我的Web服務器上發送自動電子郵件的Windows服務的教程。 我已經有了教程,但是,示例代碼每60分鍾執行一次服務,相反,我希望每天24小時執行一次服務,比如說每天早上9點。

下面是示例代碼

    private Timer scheduleTimer = null;
    private DateTime lastRun;
    private bool flag;

    public StarEmailService()
    {
        InitializeComponent();
        if (!System.Diagnostics.EventLog.SourceExists("EmailSource"))
        {
            System.Diagnostics.EventLog.CreateEventSource("EmailSource", "EmailLog");
        }
        eventLogEmail.Source = "EmailSource";
        eventLogEmail.Log = "EmailLog";

        scheduleTimer = new Timer();
        scheduleTimer.Interval = 1 * 5 * 60 * 1000;
        scheduleTimer.Elapsed += new ElapsedEventHandler(scheduleTimer_Elapsed);

    }

    protected override void OnStart(string[] args)
    {
        flag = true;
        lastRun = DateTime.Now;
        scheduleTimer.Start();
        eventLogEmail.WriteEntry("Started");
    }

    protected void scheduleTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        if (flag == true)
        {
            ServiceEmailMethod();
            lastRun = DateTime.Now;
            flag = false;
        }
        else if (flag == false)
        {
            if (lastRun.Date < DateTime.Now.Date)
            {
                ServiceEmailMethod();
            }
        }
    }

scheduleTimer.Interval = 1 * 5 * 60 * 1000; 似乎是將間隔設置為60分鍾的代碼,但是,我不確定我需要將其修改為什么才能使其在上午9點每24小時運行一次?

任何意見,將不勝感激。

謝謝。

你有幾個選擇:

不要依賴其他計時器,因為它們將來(近)不同步。

最好將計時器設置為較小的間隔,並檢查系統時間,類似於您現在的代碼。 此代碼應在每天上午9點或之后發送一封電子郵件。 您的計時器間隔越小,到上午9點就越准確。 例如,如果您將計時器間隔保持在60分鍾,則服務將每小時檢查一次系統時間,並且電子郵件將在上午9點到10點之間發送。 如果將計時器設置為10分鍾,服務將每隔tem分鍾檢查一次系統時間,並在9:00到9:10之間發送電子郵件。

此方法不會隨着時間的推移而不同步,因為它使用系統時鍾,而不是計時器間隔來知道何時觸發。

刪除lastRun DateTime字段及其所有引用。 刪除標志字段和引用。 添加名為nextRun的DateTime字段:

private DateTime nextRun = DateTime.MinValue;

添加函數GetNextRun:

private static DateTime GetNextRun(DateTime lastRun)
{
    var next = lastRun.AddDays(1);
    return new DateTime(next.Year, next.Month, next.Day, 9, 0, 0); 
}

將ScheduleTimer更改為:

protected void scheduleTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    if (DateTime.Now < nextRun) return;

    nextRun = GetNextRun(DateTime.Now);
    ServiceEmailMethod();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM