web-dev-qa-db-ja.com

C#でタイマーをリセットする方法は?

System.Threading.TimerSystem.Timers.Timer、およびSystem.Windows.Forms.Timerという3つのTimerクラスがありますが、これらをリセットする.Reset()関数はありません現在の経過時間を0にします。

この機能を持つBCLクラスはありますか?それを行う非ハック方法はありますか? (おそらく、制限時間を変更するとリセットされるかもしれないと思った)この機能を備えたTimerクラスを再実装するのがどれほど難しいか、またはBCLクラスの1つで確実に行う方法について考えましたか?

106

いつもしています ...

myTimer.Stop();
myTimer.Start();

...それはハックですか? :)

コメントごとに、Threading.Timerでは、 Change method ...

dueTime型:System.Int32 Timerの作成時に指定されたコールバックメソッドを呼び出すまでの遅延時間(ミリ秒単位)。 Timeout.Infiniteを指定して、タイマーが再起動しないようにします。タイマーをすぐに再起動するには、ゼロ(0)を指定します。

139
JP Alioto

System.Threading.Timerを除き、すべてのタイマーにはStart()およびStop()メソッドに相当するものがあります。

などの拡張メソッド...

public static void Reset(this Timer timer)
{
  timer.Stop();
  timer.Start();
}

...それを回避する方法の1つです。

55
Dan

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
23
mMontu

Reset()と呼ばれる拡張メソッドを書くことができます。

  • timers.TimerおよびForms.TimerのStop()-Start()を呼び出します
  • threading.TimerのChangeを呼び出します
6
Gishu

タイマーに新しい値を割り当てました。

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
    }
4
Quispie

他のコメントが間違っているため、明確にするために、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()を呼び出します。

3
NickSpag

タイマーの場合(System.Windows.Forms.Timer)。

.Stop、次に.Startメソッドはリセットとして機能しました。

2
elmsoftware

Windows.timerをリセットする他の代替方法は、次のようにカウンターを使用することです。

int tmrCtr = 0;
Timer mTimer;

private void ResetTimer()
{
  tmrCtr = 0;
}

private void mTimer_Tick()
{
  tmrCtr++;
  //perform task
}  

したがって、1秒ごとに繰り返す場合は、タイマー間隔を100ミリ秒に設定し、カウンターを10サイクルにテストできます。

これは、タイマーがいくつかのプロセスを待つ必要がある場合に適しています。それらのプロセスは異なる時間間隔で終了する可能性があります。

1
ivan

timer.Interval = timer.Intervalを実行できます

1
Ella Shar

私はこれをします

//Restart the timer
queueTimer.Enabled = true;
1
Rissa