System.Timers.Timer Прекратить терять значения? - PullRequest
0 голосов
/ 27 мая 2020

Я делаю консольное приложение, которое позже станет сервисным приложением Windows через Topshelf.

Я борюсь с таймерами, я устанавливаю таймер с автосбросом на 20 секунд. Когда я запускаю таймер, он работает. И когда я останавливаю его, он останавливается.

Теперь перейдем к проблеме, я хочу сохранить значение при остановке.

Мне нужен обработчик событий, как предлагает Timer. Но мне также нужен способ, который запоминает время, как секундомер. какой я должен выбрать? У меня есть доступ к серверу SQL и я его сохраняю.

Допустим, я позволил ему работать в течение 10 секунд, так как автосброс истинен, когда я его останавливаю. А затем подождите, а затем снова запустите таймер.

На мой взгляд, в следующий раз, когда я запущу таймер, он должен работать только в течение 10 секунд. Таким образом, общее время, за которое запускается событие, составляет 20 секунд, а не 30.

Есть ли способ «сэкономить» прошедшее время?

public class MySampleClient
{
    System.Timers.Timer BatchTimer;

    public MySampleClient()
    {
       BatchTimer = new System.Timers.Timer(BatchSampleTimer) { AutoReset = true };
    }

    public async Task startSession()
    {
        BatchTimer.Elapsed += BatchTimerVoid;
    }

    public void BatchIDTrigger(BatchTagDataModel btdm)
    {
        string btdmValue = btdm.Value.ToLower();

        if (batchNumberTimerControllerList.Contains(btdm.DisplayName))
        {
            if (btdmValue == "true")
            {
                BatchTimer.Start();
            }
            else 
            {
                BatchTimer.Stop();
            } 
        }
    }

    public void BatchTimerVoid(Object source, System.Timers.ElapsedEventArgs   e)
    {
        // Something happens here every 20 seconds.
    }
}

1 Ответ

0 голосов
/ 27 мая 2020

Я написал простое расширение для System.Timers.Timer, чтобы предоставить вам метод Pause(). Он использует поддержку System.Diagnostics.Stopwatch для изменения Timer.Interval в соответствии с истекшим периодом до паузы.

public class ExtendedTimer: System.Timers.Timer
{
    public long MillisecondsElapsed { get { return backingStopwatch.ElapsedMilliseconds; } }
    public new double Interval { get; private set; }

    private Stopwatch backingStopwatch;

    public ExtendedTimer(double interval) : base(interval)
    { 
        Interval = interval;
        backingStopwatch = new Stopwatch();
        base.Elapsed += ExtendedTimer_Elapsed;
    }

    private void ExtendedTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        base.Interval = this.Interval;
        backingStopwatch.Restart();
    }

    public new void Start()
    {
        base.Interval = this.Interval - backingStopwatch.ElapsedMilliseconds;
        base.Start();
        backingStopwatch.Start();
    }

    public new void Stop()
    {
        base.Stop();
        backingStopwatch.Reset();
    }

    public void Pause()
    {
        base.Stop();
        backingStopwatch.Stop();
    }
}

Поскольку теперь есть некоторые накладные расходы, я не могу сказать, насколько точно он будет поддерживать точность таймингов по сравнению с исходной реализацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...