【发布时间】:2012-05-28 08:53:38
【问题描述】:
我目前以 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)
但是,很难提供比这更多的代码,因为计时器通常会正确触发。当它嵌入到一个大型应用程序中(大约 100,000 行左右),多个线程被触发时,左、右和中心,你慢慢开始看到计时器间歇性地触发。 我看过几篇帖子暗示线程池可能已用尽,所以我目前正在查看这是否可能是我正在经历的。
【问题讨论】:
-
您能否提供一些示例代码,而不是假设计时器不可靠?我倾向于发现问题出在我自己的代码上,而不是 .NET 框架。
-
定时器设置如下:
-
线程池饥饿很可能是如果处理滴答的时间超过 10 秒。你会慢慢得到积压的物品。标准策略是在进入滴答事件时停止计时器并在结束时重新启动它,以免由于处理时间长而出现“计时器泄漏”。
-
您是否在应用程序的任何地方使用了
Parallel.ForEach或Parallel.For循环?如果这样做,请确保将MaxDegreeOfParallelism配置为合理的值(如Environment.ProcessorCount)。否则,您将获得无限并行的效果(默认配置),这意味着ThreadPool将饱和,直到源可枚举完成。