System.Threading.Timer延迟数百毫秒过期

本文关键字:百毫 过期 Threading Timer 延迟 System | 更新日期: 2023-09-27 17:58:49

我使用的是System.Threading.Timer,它被配置为在100ms后过期。通常,它会在预期时间的10ms内调用回调方法,然而,回调通常会延迟500ms调用。所谓频繁,我指的是大约25%的时间。

有人能解释一下吗?

System.Threading.Timer延迟数百毫秒过期

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

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

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

一个大锤式的解决方案是调用ThreadPool.SetMinThreads()并提高最小值。只有当你没有时间去做正确的事情时,才会考虑这个问题。

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