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


114

3つのがあるTimerクラスは私が知っていること、System.Threading.TimerSystem.Timers.Timer、およびSystem.Windows.Forms.Timer、これらのどれも持っていません.Reset()0に現在の経過時間をリセットする機能を。

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


3
JPのソリューションを使用して拡張メソッドを使用
benPearce

私も同じようにリセットする必要があり、同じ理由でFileSystemWatcherを使用するのは不快で不便です
John Lewin

タイマーにストップウォッチを使用し、拡張メソッドの回答に進む場合は、Stopwatch.Restart拡張メソッドが.NET 4.0で提供されるので注意してください。msdn.microsoft.com/en-us/library/...
si618

回答:


148

いつもしています ...

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

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

Threading.Timerのコメントごとに、それはChangeメソッドです...

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


もう1つの問題は、Forms.Timerで動作するだけで、私のアプリにはGUIがない(Application.Start()でパラメーターがない)ため、Threading.Timerクラスの方が他の理由で優れていると思いますが、良い点です。
マシューシャーリー09年

3
@Matthew:さまざまなタイマークラスの説明とそれらの使用が適切な場合については、msdn.microsoft.com / en-us / magazine / cc164015.aspxを参照してください。ただし、一般的にForms.Timerは、GUIでのみ使用する必要があります。しかし、ほかForms.TimerThreading.TimerもありますTimers.Timer
ブライアン、

60

System.Threading.Timerを除くすべてのタイマーには、Start()およびStop()メソッドと同等の機能があります。

したがって、次のような拡張メソッド...

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

...それを実行する1つの方法です。


1
経過時間を測定するつもりはありません。これの正確なユースケースは、FileSystemWatcherでディレクトリを監視していて、変更のグループ(つまり、相互に5秒以内に行われた変更など)をキャッチしたい場合です。理論では、最初の変更はタイマーを開始し、最終的にそれが起動してグループを閉じるまで、変更ごとにリセットされます。
Matthew Scharley、2009年

ええ、私はあなたの質問をもう一度読んだときにそれを発見しました。私の答えを編集しました。
ダン

これは機能し、を呼び出すだけでは機能しないことに注意することが重要ですtimer.Start()。テストするために、このLinqpadクエリを作成しました。削除timer.Stopしてみてください。違いがわかります。
Jared Beach

30

については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

1
ここでの問題は、タイマーが既に実行されているかどうかを、リセットしたいときに常にわからないことです。したがって、aTimer.Interval = TIMEOUTとaTimer.Start()を実行する必要があります。したがって、全体として、上記のリセット関数はより少ない行と変数を使用します。素晴らしい追加も。
e-motiv 2014年

1
@ RU-Bn OPには、「現在の経過時間を0にリセットする.Reset()関数」と明記されています。-タイマーが実行されているかどうかさえわからない、貧弱な設計のアプリケーションで使用することを目的としていることについては触れていません。また、作者のコメント(4年以上前)も確認してください。「最初の変更により、タイマーが開始され、変更ごとにリセットされ、最終的にグループが起動して閉じるまでの時間です。」とにかく、反対票をありがとう。
mMontu 2014年

そんな問題も見ました。私がしたことは:aTimer.Interval = aTimer.Intervalです。それがきっかけでループが続いていた。なぜ私を
Herman Van Der Blom

7

あなたはReset()と呼ばれる拡張メソッドを書くことができ、それは

  • Timers.TimerおよびForms.Timerに対してStop()-Start()を呼び出します
  • Threading.TimerのChangeを呼び出します

5

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

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
    }

5

他のいくつかのコメントは正しくないため、わかりやすくするために、System.TimersEnabledをtrue 設定すると、経過時間リセットされます。以下で動作をテストしました:

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()


いや、違うよ。のUpdateTtimer現在の値がEnablednewと等しくない場合にのみ、private メソッドが呼び出されvalueます。
ニコロ・キャランディーニ

3

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

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


1

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

int tmrCtr = 0;
Timer mTimer;

private void ResetTimer()
{
  tmrCtr = 0;
}

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

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

これは、タイマーがいくつかのプロセスを待機する必要がある場合に適しています。


1

私はこれをします

//Restart the timer
queueTimer.Enabled = true;

これは単にそれを有効にします。事前に無効にした場合でも、再度有効にしても、それまでに収集された経過時間は変わりません。
vapcguy 2017

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.