C#で、カウンターベースのwhileループをタイマーベースのwhileループに置き換えたいと思いました。
例:
while(count < 100000)
{
//do something
}
に
while(timer < X seconds)
{
//do something
}
このSystem.Timers
とThreading.Timers
用にC#.NETに2種類のタイマーがあります。どちらをどのように使用するのが良いでしょう。タイマーに余分な時間の消費やスレッドの問題を追加したくありません。
次のような構成を使用します。
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クラスの使用についてはどうでしょうか。
using System.Diagnostics;
//...
Stopwatch timer = new Stopwatch();
timer.Start();
while(timer.Elapsed.TotalSeconds < Xseconds)
{
// do something
}
timer.Stop();
それらの代わりに Stopwatch
クラスを使用できます。
経過時間を正確に測定するために使用できる一連のメソッドとプロパティを提供します。
Stopwatch sw = new Stopwatch();
sw.Start();
while (sw.Elapsed < TimeSpan.FromSeconds(X seconds))
{
//do something
}
指定された秒数を表すTimeSpanを返します。ここで、指定は最も近いミリ秒まで正確です。
_DateTime.Now.Ticks
_カウンターを使用することもできます。
_long start = DateTime.Now.Ticks;
TimeSpan duration = TimeSpan.FromMilliseconds(1000);
do
{
//
}
while (DateTime.Now.Ticks - start < duration);
_
しかし、これは忙しい待機のようなもののようです。これは、ループによってCPUの1つのコアが100%で実行されることを意味します。それは他のプロセスを遅くし、ファンをスピードアップします。何をしようとしているかにもよりますが、ループにThread.Sleep(1)
を含めることをお勧めします。