C# 计时器比System.Threading.Timer更可靠

C# 计时器比System.Threading.Timer更可靠,c#,.net,timer,C#,.net,Timer,我目前正在以10秒的间隔使用System.Threading.Timer。每次定时器启动时,我都会添加一小段代码写入一个文件,虽然大部分时间它都会准时启动,但有时(可能是在应用程序的其余部分已购买时),会在30或40秒内无法启动,并且会快速连续地一次又一次地启动 在.NET3.5中是否有更可靠的计时器 计时器的设置如下所示 Timer someTimer = new Timer(new TimerCallback(SomeMethod), null, 0, 10000); …回调是: priv

我目前正在以10秒的间隔使用System.Threading.Timer。每次定时器启动时,我都会添加一小段代码写入一个文件,虽然大部分时间它都会准时启动,但有时(可能是在应用程序的其余部分已购买时),会在30或40秒内无法启动,并且会快速连续地一次又一次地启动

在.NET3.5中是否有更可靠的计时器

计时器的设置如下所示

Timer someTimer = new Timer(new TimerCallback(SomeMethod), null, 0, 10000);
…回调是:

private static void SomeMethod(object state)
但是,很难提供比这更多的代码,因为计时器通常会正确触发。当它嵌入到一个大型应用程序(大约100000行)中时,在左、右和中触发多个线程,您慢慢地开始看到计时器间歇地触发。
我已经看到好几篇文章建议线程池可能已经耗尽,所以我目前正在查看这是否是我正在经历的情况。

参考.net中的不同计时器类

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

更精确的计时器-根据MSDN


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

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

您能提供一些示例代码,而不是假设计时器不可靠吗?我倾向于发现问题出在我自己的代码上,而不是.NET框架。计时器的设置如下:如果处理滴答声所需的时间超过10秒,很可能会出现线程池不足的情况。您将慢慢得到积压的项目。标准策略是在进入滴答事件时停止计时器,并在结束时再次启动计时器,以避免由于处理时间过长而出现“计时器泄漏”。您是否有可能使用
并行。ForEach
并行。For
在应用程序中的任何位置循环?如果需要,请确保将
MaxDegreeOfParallelism
配置为合理的值(如
Environment.ProcessorCount
)。否则,您将获得无限并行性(默认配置)的效果,这意味着
线程池将饱和,直到源枚举完成。听起来他可能正在使用它,但实际上他声明他正在使用
System.Threading.Timer
,根据metronome的质量,这是两个最“可靠”的选择之一。嗨,罗米尔,谢谢你,正如其他人所指出的,这似乎是一个线程池饥饿的问题,但还是感谢桌子。我相信它迟早会派上用场的。实际上,它不是线程安全的:“任何实例成员都不能保证线程安全。”,它是:“这种类型是线程安全的。”我希望它可能只是System.Threading.Timer特有的一个问题,通过切换到另一个计时器,我能够绕过这个问题。经过您的提示和仔细检查,它确实看起来像一个线程池饥饿问题。谢谢大家的帮助。