System.Threading.Timer迟到了几百毫秒

时间:2014-04-17 10:42:07

标签: c#

我正在使用System.Threading.Timer,它被配置为在100ms内到期。通常,它会在预期时间的10ms内调用回调方法,但是,回调通常会在最晚500毫秒内调用。经常,我的意思是大约25%的时间。

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:5)

嗯,500毫秒实际上是.NET程序中的一个神奇数字。这就是线程池管理器考虑将另一个线程添加到池中的频率,因为现有的线程似乎被卡住而没有取得进展。 Timer回调是在tp线程上进行的。

所以,看不见,你可以得出的结论是回调不能很快运行,因为你的程序中有太多的线程池线程处于活动状态。因此,当tp管理器强制将另一个线程添加到池中时,计时器回调只有机会运行。

如果准确,这是非常不健康的。可能是你有很多tp线程正在燃烧100%核心。从任务管理器中很容易看到,你会看到CPU使用率完全与100%挂钩。但更常见的是它们没有得到有效使用,而不是执行它们阻止的代码。最常见的是I / O请求,套接字读取或dbase查询。此类代码在tp线程上运行,它应该在常规线程或使用TaskCreationOptions.LongRunning配置的任务上运行。或者通过使其异步化来提高效率,C#v5 asych / await关键字可以使这更容易。

大锤解决方案是调用ThreadPool.SetMinThreads()并提高最小值。如果你没有时间做正确的话,只考虑这个。

答案 1 :(得分:1)

很简单:
1)您的操作系统不是RTOS(RealTime OS)
2)System.Threading.Timer在线程上从ThreadPool执行回调,它只能保证在经过时间间隔后调用回调的事实。