我想用基于计时器的 while 循环替换 C# 中基于计数器的 while 循环。
示例:
while(count < 100000)
{
//do something
}
到
while(timer < X seconds)
{
//do something
}
我在C# .NET中有两种计时器类型:System.Timers
和Threading.Timers
。哪一种更好使用,以及如何使用它们?我不想在计时器中增加额外的时间消耗或线程问题。
我想用基于计时器的 while 循环替换 C# 中基于计数器的 while 循环。
示例:
while(count < 100000)
{
//do something
}
到
while(timer < X seconds)
{
//do something
}
我在C# .NET中有两种计时器类型:System.Timers
和Threading.Timers
。哪一种更好使用,以及如何使用它们?我不想在计时器中增加额外的时间消耗或线程问题。
使用 Stopwatch 类如何呢?
using System.Diagnostics;
//...
Stopwatch timer = new Stopwatch();
timer.Start();
while(timer.Elapsed.TotalSeconds < Xseconds)
{
// do something
}
timer.Stop();
使用以下类似的结构:
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线程上执行此操作,否则它会阻塞输入。
您可以使用Stopwatch
类来替代它们,例如:
提供了一组方法和属性,可用于准确测量经过的时间。
Stopwatch sw = new Stopwatch();
sw.Start();
while (sw.Elapsed < TimeSpan.FromSeconds(X seconds))
{
//do something
}
从 TimeSpan.FromSecond
返回表示指定秒数的 TimeSpan,其精度精确到最近的毫秒。
返回一个 TimeSpan,该 TimeSpan 表示指定数量的秒,其中规范精确到最近的毫秒。
你可以使用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)
。