我正在制作一个控制台应用程序,该应用程序稍后将成为一个Windows服务应用程序。
我正在与定时器作斗争,我设置了一个自动重置为20秒的定时器。当我启动定时器时,它就能工作了。当我停止它的时候,它就停止了。
现在问题来了,我想在停止它的时候保留这个值。
我需要一个事件处理程序作为计时器提供。但我也需要有一种像秒表一样记住时间的方法。我应该选择哪一个?我可以访问SQL server并保存它。
假设我让它运行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.
}
}发布于 2020-05-27 18:13:59
我已经编写了一个简单的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();
}
}由于现在引入了一些开销,我不能说与原始实现相比,它将如何准确地保持精确的计时。
https://stackoverflow.com/questions/62039002
复制相似问题