web-dev-qa-db-ja.com

C#でタイマーを使用してループを実装する

C#で、カウンターベースのwhileループをタイマーベースのwhileループに置き換えたいと思いました。

例:

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

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

このSystem.TimersThreading.Timers用にC#.NETに2種類のタイマーがあります。どちらをどのように使用するのが良いでしょう。タイマーに余分な時間の消費やスレッドの問題を追加したくありません。

5
Raulp

次のような構成を使用します。

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スレッドでこれを行う場合は注意が必要です。

7

Stopwatchクラスの使用についてはどうでしょうか。

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

それらの代わりに Stopwatch クラスを使用できます。

経過時間を正確に測定するために使用できる一連のメソッドとプロパティを提供します。

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

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

から TimeSpan.FromSecond

指定された秒数を表すTimeSpanを返します。ここで、指定は最も近いミリ秒まで正確です。

6
Soner Gönül

_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)を含めることをお勧めします。

2
JeffRSon