8

我目前以 10 秒的间隔使用 System.Threading.Timer。每次定时器触发时,我都会添加一小段代码写入文件,虽然大部分时间它会按时触发,但有时(大概是在购买应用程序的其余部分时)无法触发 30或 40 秒,然后快速连续地一次又一次地开火。

我可以在 .NET 3.5 中使用更可靠的计时器吗?

定时器设置如下

Timer someTimer = new Timer(new TimerCallback(SomeMethod), null, 0, 10000);

...回调是:

private static void SomeMethod(object state)

但是,很难提供比这更多的代码,因为 Timer 通常会正确触发。当它嵌入到一个大型应用程序中(大约 100,000 行左右),多个线程被触发时,左、右和中心,你慢慢开始看到计时器间歇性地触发。我看过几篇帖子暗示 ThreadPool 可能已用尽,所以我目前正在查看这是否是我正在经历的。

4

2 回答 2

8

在 .net 中引用不同的计时器类

.net 中的不同 Timer 类

.NET 中有三个计时器类,称为“计时器”。听起来您使用的是 Windows 窗体,但实际上您可能会发现 System.Threading.Timer 类更有用 - 但要小心,因为它会回调池线程,因此您无法直接与您的窗体交互回调。

更准确的计时器 - 根据 MSDN

Windows 窗体计时器组件是单线程的,精度限制为 55 毫秒。如果您需要更准确的多线程计时器,请使用 System.Timers 命名空间中的 Timer 类。

于 2012-05-28T09:03:49.793 回答
5

这听起来就像线程池饥饿。寻找在线程池中运行的长时间运行/阻塞作业,或者使用异步 io 重写,或者在长时间运行 CPU 密集型作业的情况下,根本不要在线程池中运行这些作业。在自己的线程上运行它们或使用后台工作者。

于 2012-05-28T09:38:44.667 回答