【问题标题】:C# How to pause a timer?C#如何暂停计时器?
【发布时间】:2014-11-17 01:30:48
【问题描述】:

我有一个 C# 程序,如果用户停止与程序交互,我需要停止计时器。它需要做的是暂停,然后在用户再次活跃时重新启动。我做了一些研究,发现有这样的命令:

timer.Stop(); 

timer.Start();

但我想知道是否有这样的:

timer.Pause();

然后当用户再次激活时,它会从上次中断的地方继续,并且不会重新启动。如果有人可以提供帮助,将不胜感激! 谢谢,

弥迦

【问题讨论】:

  • 您使用的是哪个Timer 类?为什么Stop() 方法不适合您的需求?以后不能再打Start()吗?
  • 正如其他人所指出的,甚至是示例解决方案,停止/暂停计时器是不明确的,除非我们知道您尝试暂停和恢复的上下文。复杂的计算依赖于先前步骤的结果、查询数据库、监控审查员、网络等......

标签: c#


【解决方案1】:

您可以通过使用 .NET 中的 Stopwatch 类来实现这一点。只需停止和启动,您就可以继续使用秒表的实例。

请务必使用using System.Diagnostics;

var timer = new Stopwatch();
timer.Start();
timer.Stop();
Console.WriteLine(timer.Elapsed);

timer.Start(); //Continues the timer from the previously stopped time
timer.Stop();
Console.WriteLine(timer.Elapsed);

要重置秒表,只需调用ResetRestart 方法,如下所示:

timer.Reset();
timer.Restart();

【讨论】:

  • 你能解释一下为什么这个答案被否决了吗?
  • 我也没有,但问题是关于用户活动不活动。给 OP 的提示:使用两个计时器并不丢人!
  • ResetRestart有区别吗?
  • 我需要计时器,因为它有滴答事件,但秒表没有滴答事件。
  • @Black ,以防您仍然想知道 ;) Reset 停止并重置计时器; Restart 是一样的,只是它也会启动重置的秒表。
【解决方案2】:

我为这种情况创建了这个类:

public class PausableTimer : Timer
{
    public double RemainingAfterPause { get; private set; }

    private readonly Stopwatch _stopwatch;
    private readonly double _initialInterval;
    private bool _resumed;

    public PausableTimer(double interval) : base(interval)
    {
        _initialInterval = interval;
        Elapsed += OnElapsed;
        _stopwatch = new Stopwatch();
    }

    public new void Start()
    {
        ResetStopwatch();
        base.Start();
    }

    private void OnElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
    {
        if (_resumed)
        {
            _resumed = false;
            Stop();
            Interval = _initialInterval;
            Start();
        }

        ResetStopwatch();
    }

    private void ResetStopwatch()
    {
        _stopwatch.Reset();
        _stopwatch.Start();
    }

    public void Pause()
    {
        Stop();
        _stopwatch.Stop();
        RemainingAfterPause = Interval - _stopwatch.Elapsed.TotalMilliseconds;
    }

    public void Resume()
    {
        _resumed = true;
        Interval = RemainingAfterPause;
        RemainingAfterPause = 0;
        Start();
    }

}

【讨论】:

    【解决方案3】:

    没有暂停,因为很容易做到这一点。您可以停止计时器而不是暂停它,然后当您需要重新启动它时,您只需要指定剩余的时间量。它可能很复杂,也可能很简单;这取决于您使用计时器做什么。您所做的事情取决于您使用计时器的目的,这可能是暂停不存在的原因。

    您可能正在使用计时器在固定的时间段内重复执行某些操作,或者您可能正在使用计时器倒计时到特定时间。如果您正在重复做某事(例如每秒),那么您的要求可能是在该时间段的开始(一秒)或该时间段的一部分重新启动。如果暂停时间超过该时间段会发生什么?通常错过的事件会被忽略,但这取决于需求。

    所以我想说你需要确定你的要求。然后,如果您需要帮助,请说明您需要什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      相关资源
      最近更新 更多