在本例中,我使用的是OpenNETCF Timer2 (以及以前的System.Threading.Timer)。计时器的行为非常奇怪。大约7-8小时后。它以2秒而不是1秒的间隔随机调用一些计时器事件函数。并在接下来的7-8小时内表现正常。友好的指南,我已经尝试了System.Threading.Timers,但它似乎调用计时器事件2秒,而不是每2分钟1秒。如何解决这个问题?
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行具有相同的时间戳。
发布于 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编写需要它的部分,并且知道如何在那里实现确定性。
https://stackoverflow.com/questions/35198341
复制相似问题