微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可暂停的 System.Timers.Timer

如何解决可暂停的 System.Timers.Timer

我发现自己需要无限期地精确暂停计时器,但仍保持它的状态,不是在暂停后重新启动它,而是真正地暂停它,就像您可以在手表或手机应用上做的那样。 问题是 Timers.Timer 只有 Stop()/Start() 可以重置它,而 Enabled 也一样。

解决方法

using System;
using System.Timers;

namespace zLib {
    /// <summary>
    /// System.Timers.Timer modified to allow pausing.
    /// It saves start and pause time to release for reminder and correct back to original time
    /// </summary>
    public class PausableTimer : Timer {
        public PausableTimer(double interval) : base(interval) {
            Interval = interval;
            base.Elapsed += PausableTimer_Elapsed;
        }

        public PausableTimer() : base() {
            base.Elapsed += PausableTimer_Elapsed;
        }

        private void PausableTimer_Elapsed(object sender,ElapsedEventArgs e) {
            ElapsedEventHandler temp = Elapsed;
            if (temp != null) {
                temp(sender,e);
            }
        }

        private double interval;
        public new double Interval {
            get { return interval; } 
            set { interval = value; if (!wasPaused) base.Interval = interval; }
        }

        public new event ElapsedEventHandler Elapsed;

        private bool wasPaused;
        private DateTime startedAt;
        private DateTime pausedAt;

        public new void Start() {
            startedAt = DateTime.Now;
            base.Start();
        }

        public void Pause() {
            wasPaused = true;
            pausedAt = DateTime.Now;
            base.Stop();
        }

        public void Release() {
            //Set temporal interval
            base.Interval = Interval - ((pausedAt - startedAt).TotalMilliseconds % Interval);
            base.Elapsed += PausableTimer_ElapsedAfterPause;
            base.Start();
        }

        private void PausableTimer_ElapsedAfterPause(object sender,ElapsedEventArgs e) {
            base.Interval = Interval;
            base.Elapsed -= PausableTimer_ElapsedAfterPause;
            wasPaused = false;
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。