Search code examples
c#timer

Executing method every hour on the hour


I want to execute a method every hour on the hour. I wrote some code,but it is not enough for my aim. Below code is working every 60 minutes.

public void Start()
{
    System.Threading.Timer timerTemaUserBilgileri = new System.Threading.Timer(new System.Threading.TimerCallback(RunTakip), null, tmrTemaUserBilgileri, 0);
}

public void RunTakip(object temauserID)
{
    try 
    {
        string objID = "6143566557387";
        EssentialMethod(objID);
        TimeSpan span = DateTime.Now.Subtract(lastRunTime);
        if (span.Minutes > 60)
        {
            tmrTemaUserBilgileri = 1 * 1000;
            timerTemaUserBilgileri.Change(tmrTemaUserBilgileri, 0);
        }
        else
        {
            tmrTemaUserBilgileri = (60 - span.Minutes) * 60 * 1000;
            timerTemaUserBilgileri.Change(tmrTemaUserBilgileri, 0);
        }
        watch.Stop();
        var elapsedMs = watch.ElapsedMilliseconds;
    }
    catch (Exception ex)
    {
        timerTemaUserBilgileri.Change(30 * 60 * 1000, 0);
        Utils.LogYaz(ex.Message.ToString());
    }
}

public void EssentialMethod(objec obj)
{
    //some code
    lastRunTime = DateTime.Now;
    //send lastruntime to sql 
}

Solution

  • If you want your code to be executed every 60 minutes:

    aTimer = new System.Timers.Timer(60 * 60 * 1000); //one hour in milliseconds
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    aTimer.Start();
    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        //Do the stuff you want to be done every hour;
    }
    

    if you want your code to be executed every hour (i.e. 1:00, 2:00, 3:00) you can create a timer with some small interval (let's say a second, depends on precision you need) and inside that timer event check if an hour has passed

    aTimer = new System.Timers.Timer(1000); //One second, (use less to add precision, use more to consume less processor time
    int lastHour = DateTime.Now.Hour;
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    aTimer.Start();
    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        if(lastHour < DateTime.Now.Hour || (lastHour == 23 && DateTime.Now.Hour == 0))
         {
               lastHour = DateTime.Now.Hour;
               YourImportantMethod(); // Call The method with your important staff..
         }
    
    }