【发布时间】:2014-07-17 19:13:05
【问题描述】:
我的代码看起来像这样
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 秒的时间。
我明显做错了什么吗?也许我可以收集更多数据来弄清楚为什么我的计时器表现得很有趣?
如有任何建议,我们将不胜感激。
【问题讨论】:
-
您是否在您的程序中做其他会导致线程池中大量线程正在使用的事情?
-
有相当多的线程被抛出(不幸的是,我们被困在使用使用大量线程的第三方库中)。对于这个特定实例,应用程序有大约 250 个线程,总 CPU 使用率约为 11% (i7 4770)。
标签: c# .net timer system.timers.timer