使用定时器在C#中实现循环

12

我想用基于计时器的 while 循环替换 C# 中基于计数器的 while 循环。

示例:

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

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

我在C# .NET中有两种计时器类型:System.TimersThreading.Timers。哪一种更好使用,以及如何使用它们?我不想在计时器中增加额外的时间消耗或线程问题。


可能是如何在特定时间内执行循环的重复问题。 - Eren Ersönmez
4个回答

31

使用 Stopwatch 类如何呢?

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

12

使用以下类似的结构:

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;
}

但要小心,要在UI线程上执行此操作,否则它会阻塞输入。


这个会是个问题吗? - Raulp
@Raulp 我不这么认为。你可以试试看 :). - Bart Friederichs

8

您可以使用Stopwatch类来替代它们,例如:

提供了一组方法和属性,可用于准确测量经过的时间。

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

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

TimeSpan.FromSecond 返回表示指定秒数的 TimeSpan,其精度精确到最近的毫秒。

返回一个 TimeSpan,该 TimeSpan 表示指定数量的秒,其中规范精确到最近的毫秒。


2

你可以使用DateTime.Now.Ticks计数器:

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

然而,这似乎有点像忙等待。这意味着循环将导致您的CPU的一个核心运行在100%。它会减慢其他进程,加速风扇等等。虽然这取决于您打算做什么,但我建议在循环中包含Thread.Sleep(1)


哇,太棒了!实际上我一直在尝试解决你在这里完美描述的CPU问题。非常感谢,我被深深吸引了。祝好! - smoothumut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接