10

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

例子 :

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

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

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

4

4 回答 4

28

使用 Stopwatch 类怎么样。

using System.Diagnostics;
//...
Stopwatch timer = new Stopwatch();
timer.Start();
while(timer.Elapsed.TotalSeconds < Xseconds)
{
    // do something
}
timer.Stop();
于 2013-07-02T06:33:13.253 回答
10

使用这样的构造:

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 线程上执行此操作,因为它会阻止输入。

于 2013-07-02T06:34:48.387 回答
8

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

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

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

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

TimeSpan.FromSecond

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

于 2013-07-02T06:33:30.270 回答
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)在循环中。

于 2013-07-02T07:11:47.887 回答