首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >7-8小时后OpenNETCF.Timers.Timer2和System.threading.timer计时错误事件调用

7-8小时后OpenNETCF.Timers.Timer2和System.threading.timer计时错误事件调用
EN

Stack Overflow用户
提问于 2016-02-04 18:20:47
回答 1查看 218关注 0票数 2

在本例中,我使用的是OpenNETCF Timer2 (以及以前的System.Threading.Timer)。计时器的行为非常奇怪。大约7-8小时后。它以2秒而不是1秒的间隔随机调用一些计时器事件函数。并在接下来的7-8小时内表现正常。友好的指南,我已经尝试了System.Threading.Timers,但它似乎调用计时器事件2秒,而不是每2分钟1秒。如何解决这个问题?

代码语言:javascript
复制
public partial class Form1 : Form
{
    private OpenNETCF.Timers.Timer2 mTimer2;
    private DateTime mLastSampleTime;
    private Int32 Interval;
    private Double ActualInterval;
    private long ActualTickInterval;`enter code here`
    StreamWriter file;
    Boolean firstRun = true;

    //private Timer sysTimer;

    public Form1()
    {
        InitializeComponent();
        /// <summary>
        /// Timer object for Windows CE environment.
        /// </summary>
        /// 

        // This text is always added, making the file longer over time
        // if it is not deleted.
        file = System.IO.File.AppendText("TimerLog.txt");




        mTimer2 = new OpenNETCF.Timers.Timer2(1000);//1000 for actual test
        mTimer2.AutoReset = true;
        mTimer2.Elapsed += Timer2Event;
        mTimer2.Start();
        file.WriteLine("TImer Started");

    }


    private void Timer2Event(object sender,
        OpenNETCF.Timers.ElapsedEventArgs e)
    {
         try
        {

            DateTime now = DateTime.UtcNow;

            if (!firstRun) //do not calculate difference if first run
            {
                //ActualInterval = ((now - mLastSampleTime).TotalMilliseconds);//Difference between previous timestamp and current (in milliseconds)
                ActualTickInterval = ((now - mLastSampleTime).Ticks);//Difference between previous timestamp and current (in ticks)
                Interval = Convert.ToInt32((now - mLastSampleTime).TotalSeconds);//Interval as used in LAMP code

                if (Interval >= 2) file.Write("-------->");//if Interval is 2 seconds, Mark it.
                file.Write("UTC Now: " + now.ToString() +" Current Tick: "+now.Ticks.ToString() +" Actual Interval: " + ActualInterval + " Actual Tick Difference: "+ActualTickInterval.ToString()+" Deviation (Ideal=0) "+(ActualTickInterval-10000000).ToString()+"\r\n");
                file.Flush();    
            }
            else
            {
                firstRun = false;
            }
             mLastSampleTime = now;
        }
        catch (Exception exp)
        {   
            file.Write("Logging Failed " + DateTime.UtcNow.ToString() + " exception: " + exp.Message+"\r\n");
        }
    }



    }

}

对于这些特定的情况,节拍差异直接从10,000,000跳到2,000,000。随后的刻度差是0。即,日志文件中的2行具有相同的时间戳。

EN

回答 1

Stack Overflow用户

发布于 2016-02-05 04:45:21

实际上,您的测试逻辑中存在一个问题,它可能会解释您所看到的行为。

在Windows CE下是非常罕见的-我的意思是在我的经验中非常罕见-系统时钟的结果小于1整秒。事实上,它通常与硬件RTC捆绑在一起,只提供1秒的分辨率。这意味着使用DateTime.Ticks的数学运算没有什么用处,与1:00.999和1:02:001的差异将显示为2秒的差距,而不是1.002。

将您的逻辑更改为使用Environment.TickCount来测量刻度之间经过的时间,您应该每次都会看到接近1000的数字,这将消除您所看到的工件的可能性。

编辑

与内置窗体计时器一样,Timer2对象也是基于Windows消息泵节拍的,并不要求非常精确。1000ms +/-几十个对我来说一点也不奇怪。

如果需要更高的精度,则应使用线程计时器或高精度计时器(在OpenNETCF.Timers命名空间下的SDF中提供)。然而,即使有了这些,你也必须意识到你是在一个托管的垃圾收集环境中运行的,所以绝对不能保证你会得到一致的准确的1000ms的节拍。如果你需要绝对的确定性行为,你需要用C编写需要它的部分,并且知道如何在那里实现确定性。

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

https://stackoverflow.com/questions/35198341

复制
相关文章

相似问题

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