如何解决可暂停的 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 举报,一经查实,本站将立刻删除。