【问题标题】:Setting up an elapsed timer event设置经过的计时器事件
【发布时间】:2010-10-07 14:43:13
【问题描述】:

我需要测量收到最后一个数据包与新数据包到达之间的时间差。我曾尝试在 C# 中使用 Timer 类:

while (listening)
            {
                if (hB != null)
                {
                    interval = hB.GetHBInterval();
                    aTimer = new System.Timers.Timer(interval+5);
                    Console.WriteLine("Interval is: {0}", interval);    
                    byte[] bytes = listener.Receive(ref groupEP);
                    DecodeUDPMessage(Encoding.UTF8.GetString(bytes, 0, bytes.Length));
                }
                else
                {
                    byte[] bytes = listener.Receive(ref groupEP);
                    DecodeUDPMessage(Encoding.UTF8.GetString(bytes, 0, bytes.Length));
                }
            }

我最初拥有它是为了在间隔时间长度之后计时器经过时调用一个事件。但是意识到定时器会等待间隔的长度再调用事件。我需要弄清楚的是,我能否计算出最后一个数据包到达的时间和新数据包到达的时间的区别。如果可以的话,我需要根据间隔值对其进行评估,如果它更大,则调用另一个可以做一些工作的方法。

我的大脑已经死去试图弄清楚这一点,所以任何帮助都将不胜感激。

【问题讨论】:

    标签: c# .net timer


    【解决方案1】:

    您应该存储DateTime.Now,然后与存储的值进行比较。

    例如:

    var lastTime = DateTime.Now;
    //Do things...
    if ((DateTime.Now - lastTime).TotalSeconds > 5)
        //Do other things
    

    【讨论】:

    • 问题是,在设置定时器之后应该运行的代码部分在收到另一个数据包之前不会执行。那么我怎样才能继续查看已经过去了多长时间呢?我应该把它放在另一个线程上然后如果发现一个数据包重新启动计时过程并重复这个?
    • 您希望函数何时运行?
    • 该函数只应在经过的时间大于间隔时间时运行。这意味着间隔已经结束,您现在应该收到另一个数据包。如果您在间隔内没有收到此数据包,则调用该函数请求数据包。
    • 那么你应该创建一个System.Timers.Timer 并处理它的Elapsed 事件。
    • 是的,这就是我最初所做的,我愚蠢地从未在收到数据包后将计时器设置为禁用。所以它一直在计时,并且总是会达到时间限制。再次感谢您的帮助。
    【解决方案2】:

    您可能想查看 System.Diagnostics.Stopwatch 类而不是使用计时器

    【讨论】:

    • 这里不需要秒表。 (它主要用于在短时间内测量性能)
    猜你喜欢
    • 2023-04-08
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多