abdul subhan mohammed Ответов: 3

Как остановить/возобновить оставшееся время C#?


Дорогие Все,

У меня есть приложение windows, в котором я должен отображать "оставшееся время".

Теперь у меня есть требование остановить/возобновить "оставшееся время".

Что я уже пробовал:

//ОСТАЮЩИЙСЯ КОД ВРЕМЕНИ
public TimeSpan RemainingTime
        {
            get
            {
                _elapsedTime = DateTime.Now - StartTime;
                TimeSpan remainingTime = Duration - _elapsedTime;

                if (remainingTime > TimeSpan.Zero)
                    return remainingTime;
                else
                    return TimeSpan.Zero;
            }
        }


Здесь проблема в том, что я использую DateTime.Теперь нужно рассчитать оставшееся, так что я не могу остановить/возобновить оставшееся время. Даже несмотря на то, что я использую timerTick_Event.

Кто-нибудь может пожалуйста помочь мне.


Спасибо

3 Ответов

Рейтинг:
2

Patrice T

Цитата:
Теперь у меня есть требование остановить/возобновить "оставшееся время".

Довольно просто, добавьте переменную OffsetTime в свой код.
за истекшее время:
при запуске offsettime = 0
на бегу, истекшее время = дата и время.Теперь - StartTime + OffsetTime
при остановке OffsetTime = DateTime.Теперь - StartTime + OffsetTime
когда остановился, истекшее время = OffsetTime
для обратного отсчета:
при запуске просто установите OffsetTime на оставшееся время


Рейтинг:
1

Richard Deeming

Вместо того чтобы использовать DateTime.Now чтобы измерить прошедшее время, используйте класс секундомера[^].

private Stopwatch _timer;

public void Start()
{
    _timer = Stopwatch.StartNew();
}

public void Pause()
{
    if (_timer is null) throw new InvalidOperationException();
    if (_timer.IsRunning) _timer.Stop();
}

public void Resume()
{
    if (_timer is null) throw new InvalidOperationException();
    if (!_timer.IsRunning) _timer.Start();
}

public TimeSpan RemainingTime
{
    get
    {
        if (_timer is null) return TimeSpan.MaxValue;
        
        TimeSpan remainingTime = Duration - _timer.Elapsed;
        return remainingTime > TimeSpan.Zero ? remainingTime : TimeSpan.Zero;
    }
}


Рейтинг:
0

OriginalGriff

Если вы используете время начала и теперь для вычисления "времени выполнения до сих пор" (что является правильным способом, тиковые события не являются реальным временем, поэтому они "дрейфуют", если вы предполагаете, что они точны), то единственный способ "приостановить таймер" - это сохранить прошедшее время, когда вы нажмете "пауза", и пересчитать "время начала", когда вы снимаете паузу, основываясь на текущем времени в этот момент.

Pause:
   elapsedTime = DateTime.Now - StartTime;
   paused = true;

UnPause:
   StartTime = DateTime.Now - elapsedTime;
   paused = false;