System.Threading.Timer
、System.Timers.Timer
、およびSystem.Windows.Forms.Timer
という3つのTimer
クラスがありますが、これらをリセットする.Reset()
関数はありません現在の経過時間を0にします。
この機能を持つBCLクラスはありますか?それを行う非ハック方法はありますか? (おそらく、制限時間を変更するとリセットされるかもしれないと思った)この機能を備えたTimer
クラスを再実装するのがどれほど難しいか、またはBCLクラスの1つで確実に行う方法について考えましたか?
いつもしています ...
myTimer.Stop();
myTimer.Start();
...それはハックですか? :)
コメントごとに、Threading.Timerでは、 Change method ...
dueTime型:
System.Int32
Timerの作成時に指定されたコールバックメソッドを呼び出すまでの遅延時間(ミリ秒単位)。Timeout.Infinite
を指定して、タイマーが再起動しないようにします。タイマーをすぐに再起動するには、ゼロ(0)を指定します。
System.Threading.Timerを除き、すべてのタイマーにはStart()およびStop()メソッドに相当するものがあります。
などの拡張メソッド...
public static void Reset(this Timer timer)
{
timer.Stop();
timer.Start();
}
...それを回避する方法の1つです。
System.Timers.Timer
の場合、MSDNドキュメントによると、 http://msdn.Microsoft.com/en-us/library/system.timers.timer.enabled.aspx :
タイマーの開始後に間隔が設定されると、カウントがリセットされます。たとえば、間隔を5秒に設定し、Enabledプロパティをtrueに設定した場合、カウントはEnabledが設定された時点から始まります。カウントが3秒のときに間隔を10秒にリセットすると、Enabledがtrueに設定されてから13秒後にElapsedイベントが初めて発生します。
そう、
const double TIMEOUT = 5000; // milliseconds
aTimer = new System.Timers.Timer(TIMEOUT);
aTimer.Start(); // timer start running
:
:
aTimer.Interval = TIMEOUT; // restart the timer
Reset()と呼ばれる拡張メソッドを書くことができます。
タイマーに新しい値を割り当てました。
mytimer.Change(10000, 0); // reset to 10 seconds
私にとってはうまくいきます。
コードの先頭でタイマーを定義します:System.Threading.Timer myTimer;
if (!active)
{
myTimer= new System.Threading.Timer(new TimerCallback(TimerProc));
}
myTimer.Change(10000, 0);
active = true;
private void TimerProc(object state)
{
// The state object is the Timer object.
System.Threading.Timer t = (System.Threading.Timer)state;
t.Dispose();
Console.WriteLine("The timer callback executes.");
active = false;
//action to do when timer is back to zero
}
他のコメントが間違っているため、明確にするために、System.Timers
設定を使用する場合は、Enabledをtrueに設定しますwill経過時間をリセットします。私は以下で動作をテストしました:
Timer countDown= new Timer(3000);
Main()
{
TextBox.TextDidChange += TextBox_TextDidChange;
countdown.Elapsed += CountDown_Elapsed;
}
void TextBox_TextDidChange(Object sender, EventArgs e)
{
countdown.Enabled = true;
}
void CountDown_Elapsed(object sender, EventArgs e)
{
System.Console.WriteLine("Elapsed");
}
テキストボックスにテキストを繰り返し入力し、タイマーは最後のキーストロークの3秒後にのみ実行されます。ご覧のように、ドキュメントでもヒントが示されています:Timers.Start()
を呼び出すと、単にEnabledがtrueに設定されます。
確かに、最初からまっすぐに行っておくべきでしたが、 。NET参照ソース で、既に有効なタイマーを有効にすると、プライベートのUpdateTimer()
メソッドが呼び出されることがわかります。内部でChange()
を呼び出します。
タイマーの場合(System.Windows.Forms.Timer)。
.Stop、次に.Startメソッドはリセットとして機能しました。
Windows.timerをリセットする他の代替方法は、次のようにカウンターを使用することです。
int tmrCtr = 0;
Timer mTimer;
private void ResetTimer()
{
tmrCtr = 0;
}
private void mTimer_Tick()
{
tmrCtr++;
//perform task
}
したがって、1秒ごとに繰り返す場合は、タイマー間隔を100ミリ秒に設定し、カウンターを10サイクルにテストできます。
これは、タイマーがいくつかのプロセスを待つ必要がある場合に適しています。それらのプロセスは異なる時間間隔で終了する可能性があります。
timer.Interval = timer.Interval
を実行できます
私はこれをします
//Restart the timer
queueTimer.Enabled = true;