user3584576
user3584576

Reputation: 15

C# How to run delayed method in between timer ticks

I am using a timer to run a method every 16 minutes. I also want to run a second method every minute for 15 minutes in-between.

Below is the code I am using:

int count =  0;

private void cmdGo_Click(object sender, EventArgs e)
{
        System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
        t.Interval = 960000; // specify interval time - 16 mins
        t.Tick += new EventHandler(timer_Tick);
        t.Start();
}

void timer_Tick(object sender, EventArgs e)
{
        RunMethod1();

        while(count < 15)
        {
            //waiting for 60 seconds 
            DateTime wait = DateTime.Now;
            do
            {
                 Application.DoEvents();
            } while (wait.AddSeconds(60) > DateTime.Now);

            RunMethod2();
        }
}

The above code seems to work fine but the ‘do while’ loop to wait for 60 seconds is very CPU heavy.

I tried to use Thread.Sleep(60000) but this freezes up the Interface and also tried to add a second timer within timer_Tick but this doesn’t seem possible. Can a second timer be added within the EventHandler of the first?

Is there any other method to achieve this without being so CPU intensive?

Thanks! Warren

NOTE: Sorry guys, there was a typo in my original post. The 60 second wait do, while loop should have been within the while < 15 loop. Just updated the code snippet.

So:

Upvotes: 1

Views: 2330

Answers (2)

Me.Name
Me.Name

Reputation: 12544

You could await a task Delay so the UI will keep responding

    async void timer_Tick(object sender, EventArgs e)
    {
        RunMethod1();



        while (count < 15)
        {
            //waiting for 60 seconds 
            await Task.Delay(60000);

            RunMethod2();
        }
    }

Upvotes: 1

Belogix
Belogix

Reputation: 8147

It would make more sense to have a counter to store how many times the clock has gone off. Then set your timer interval to fire once a minute so not doing anything in between...

That way you could just do...

private int Counter;

private void cmdGo_Click(object sender, EventArgs e)
{
    System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
    t.Interval = 60000; // specify interval time - 1 minute
    t.Tick += new EventHandler(timer_Tick);
    t.Start();
}

// Every 1 min this timer fires...
void timer_Tick(object sender, EventArgs e)
{
    // If it has been 16 minutes then run RunMethod1
    if (++Counter >= 16)
    {
        Counter = 0;
        RunMethod1();         
        return;
    }

    // Not yet been 16 minutes so just run RunMethod2
    RunMethod2();
}

Upvotes: 1

Related Questions