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 の 1 つのコアが 100% で実行されることを意味します。それは他のプロセスを遅くし、ファンをスピードアップします。何をしようとしているのかにもよりますThread.Sleep(1)が、ループに含めることをお勧めします。

于 2013-07-02T07:11:47.887 に答える