首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Timers.Timer不再失去价值?

System.Timers.Timer不再失去价值?
EN

Stack Overflow用户
提问于 2020-05-27 16:48:04
回答 1查看 117关注 0票数 0

我正在制作一个控制台应用程序,该应用程序稍后将成为一个Windows服务应用程序。

我正在与定时器作斗争,我设置了一个自动重置为20秒的定时器。当我启动定时器时,它就能工作了。当我停止它的时候,它就停止了。

现在问题来了,我想在停止它的时候保留这个值。

我需要一个事件处理程序作为计时器提供。但我也需要有一种像秒表一样记住时间的方法。我应该选择哪一个?我可以访问SQL server并保存它。

假设我让它运行10秒,因为自动重置是真的,当我停止它的时候。然后等待,然后再次启动计时器。

在我看来,下一次启动计时器时,它应该只运行10秒。因此,触发事件的总时间是20秒,而不是30秒。

有没有办法“节省”它的运行时间?

代码语言:javascript
复制
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.
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-27 18:13:59

我已经编写了一个简单的System.Timers.Timer扩展来为您提供Pause()方法。它根据暂停前经过的时间段,使用一个后备System.Diagnostics.Stopwatch来修改Timer.Interval

代码语言:javascript
复制
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();
    }
}

由于现在引入了一些开销,我不能说与原始实现相比,它将如何准确地保持精确的计时。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62039002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档