Raulp
Raulp

Reputation: 8206

Implementing a loop using a timer in C#

I wanted to replace a counter based while loop with the timer based while loop in C#.

Example :

while(count < 100000)
{
   //do something 
}

to

while(timer < X seconds)
{
    //do something 
}

I have two types of timers in C# .NET for this System.Timers and Threading.Timers . Which one will be better to use and how.I don't want to add extra time consumption or threading issues with the timer.

Upvotes: 13

Views: 74697

Answers (4)

Bart Friederichs
Bart Friederichs

Reputation: 33573

Use a construct like this:

Timer r = new System.Timers.Timer(timeout_in_ms);
r.Elapsed += new ElapsedEventHandler(timer_Elapsed);
r.Enabled = true;
running = true;
while (running) {
   // do stuff
}
r.Enabled = false;

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
   running = false;
}

Be careful though to do this on the UI thread, as it will block input.

Upvotes: 13

JeffRSon
JeffRSon

Reputation: 11216

You might as well use the DateTime.Now.Ticks counter:

long start = DateTime.Now.Ticks;
TimeSpan duration = TimeSpan.FromMilliseconds(1000);
do
{
  //
}
while (DateTime.Now.Ticks - start < duration);

However, this seems to be something like busy waiting. That means that the loop will cause one core of your CPU to run at 100%. It will slow down other processes, speed up fans a.s.o. Although it depends on what you intend to do I would recommend to include Thread.Sleep(1) in the loop.

Upvotes: 3

Soner G&#246;n&#252;l
Soner G&#246;n&#252;l

Reputation: 98868

You can use Stopwatch class instead of them, like;

Provides a set of methods and properties that you can use to accurately measure elapsed time.

Stopwatch sw = new Stopwatch();
sw.Start();

while (sw.Elapsed < TimeSpan.FromSeconds(X seconds)) 
{
   //do something
}

From TimeSpan.FromSecond

Returns a TimeSpan that represents a specified number of seconds, where the specification is accurate to the nearest millisecond.

Upvotes: 8

Casperah
Casperah

Reputation: 4564

What about using the Stopwatch class.

using System.Diagnostics;
//...
Stopwatch timer = new Stopwatch();
timer.Start();
while(timer.Elapsed.TotalSeconds < Xseconds)
{
    // do something
}
timer.Stop();

Upvotes: 33

Related Questions