我有看起来像这样的代码
mTestModeMetadataTimer = new System.Threading.Timer(SomeTimerCallback, null, 1000, Timeout.Infinite);
Stopwatch tmStopwatch = new Stopwatch();
private void SomeTimerCallback(object state)
{
// doing minimal work here
Console.WriteLine("{0}: SomeTimerCallback time: {1}", System.Threading.Thread.CurrentThread.ManagedThreadId, tmStopwatch.ElapsedMilliseconds);
tmStopwatch.Restart();
// Better to be on the safe side and do this slightly more than once per second, than slightly less.
mTestModeMetadataTimer.Change(990, Timeout.Infinite);
}
一切正常,只是偶尔会在此控制台输出中看到计时器事件之间存在巨大延迟。
31: SomeTimerCallback time: 998
21: SomeTimerCallback time: 997
20: SomeTimerCallback time: 999
3: SomeTimerCallback time: 989
3: SomeTimerCallback time: 1000
3: SomeTimerCallback time: 994
37: SomeTimerCallback time: 999
3: SomeTimerCallback time: 991
29: SomeTimerCallback time: 1002
37: SomeTimerCallback time: 1000
3: SomeTimerCallback time: 17568
3: SomeTimerCallback time: 999
29: SomeTimerCallback time: 993
这是一个相当大的应用程序的一小部分。System.Timers.Timer 存在相同的行为,事实上,在整个应用程序中的其他不同时间都会发生。我将线程 ID 添加到这个特定计时器的控制台输出中,希望能更深入地了解为什么在正确的一秒事件中随机经过 17.5 秒的时间。
有什么我明显做错了吗?也许我可以收集更多数据来弄清楚为什么我的计时器表现得很有趣?
这里的任何建议将不胜感激。