7

System.Timers.Timer.NET アプリケーションでの の使用について質問があります。

3 つの異なるイベントがあり、1 つは毎秒トリガー、もう 1 つは毎分トリガー、最後のイベントは 30 分ごとにトリガーします。

タイマーを 1 つ使用するか、3 つ使用するかは、パフォーマンスの面で優れていますか?

1 つのタイマーでそれを行う方法は、ElapsedEventArgsSignalTime をチェックし、以前に測定した時間と比較することです。もちろん、DateTime を変更した場合、これはまったく機能しませんが、ここでは問題ではありません。基本的に毎秒経過するごとに、1分または30分経過したかどうかも確認します...

私の懸念は、3 つのタイマーを使用するとオーバーヘッドが大きくなりすぎることです。私は間違っていますか?シンプルさと明確さのために3を使用する必要がありますか、それとも1つのタイマーで十分ですか?

コード:

private void TimerEverySecondElapsed(object sender, ElapsedEventArgs e)
    {
        timerEverySecond.Enabled = false;
        OnTimerElapsed(TimerType.EverySecond);

        // Raise an event every minute
        if ((e.SignalTime - previousMinute) >= minuteSpan)
        {
            OnTimerElapsed(TimerType.EveryMinute);
            previousMinute = e.SignalTime;
        }

        // Raise an event every half hour
        if ((e.SignalTime - previousHalfhour) >= semiHourSpan)
        {
            OnTimerElapsed(TimerType.EverySemiHour);
            previousHalfhour = e.SignalTime;
        }

        timerEverySecond.Enabled = true;
    }

minuteSpan読み取り専用のsemiHourSpanTimeSpan です。

4

3 に答える 3

5

どちらにしてもあまり変わらないでしょう。タイマーの数に関係なく、バックグラウンドで実行されるループは 1 つだけです。効率が最も低い場合、スレッド プールから 3 つのスレッドを使用しますが、利用可能なスレッドが多いため、大したことではありません。あなたのコードが読みやすくなるなら、私はそれを選ぶと思います。

Threading.Timerただし、これは(AKA )にのみ適用されることに注意してくださいTimers.TimerForms.TimerUI スレッドでのみ動作するため、同期の問題が発生する可能性があるため、これらのいずれかを使用することをお勧めします。

Threading.Timer と Forms.Timer の比較

その他のリソース:

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/f9a1c67d-8579-4baa-9952-20b3c0daf38a/

System.Timers.Timer インスタンスはいくつ作成できますか? どこまでスケーリングできますか?

于 2012-12-06T11:24:17.790 に答える
0

if のチェックは、3 つのタイマーよりもオーバーヘッドが大きいと思います。さらに、1 つのタイマーを使用しようとすると、奇妙な状況に陥ることがあります。

タイマーは3つ持っていこうと思います。

于 2012-12-06T11:24:11.600 に答える
0

3 つのタイマーは、1 つに比べてオーバーヘッドをほとんど追加せず、コードは (読みやすさと保守性の点で) はるかに優れている可能性が高くなります。

于 2012-12-06T11:22:57.043 に答える