12

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.

Ionică Bizău
  • 109,027
  • 88
  • 289
  • 474
Raulp
  • 7,758
  • 20
  • 93
  • 155
  • possible duplicate of [How to execute the loop for specific time](http://stackoverflow.com/questions/5945533/how-to-execute-the-loop-for-specific-time) – Eren Ersönmez Jul 02 '13 at 06:36

4 Answers4

31

What about using the Stopwatch class.

using System.Diagnostics;
//...
Stopwatch timer = new Stopwatch();
timer.Start();
while(timer.Elapsed.TotalSeconds < Xseconds)
{
    // do something
}
timer.Stop();
Casperah
  • 4,504
  • 1
  • 19
  • 13
12

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.

Exa
  • 4,020
  • 7
  • 43
  • 60
Bart Friederichs
  • 33,050
  • 15
  • 95
  • 195
8

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.

Soner Gönül
  • 97,193
  • 102
  • 206
  • 364
2

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.

JeffRSon
  • 10,404
  • 4
  • 26
  • 51
  • Wow great solution. Actually I was trying to solve the cpu issue which you perfectly described in here. Thanks a lot, I was fascinated. Regards – smoothumut Oct 10 '19 at 13:26