C# .Net应用程序线程/计时器性能
我正在开发一个启动System.Threading.Timer的应用程序,它可以相当快速地读取/写入串行端口(每100ms一次)。计时器的回调方法如下所示:-C# .Net应用程序线程/计时器性能,c#,multithreading,C#,Multithreading,我正在开发一个启动System.Threading.Timer的应用程序,它可以相当快速地读取/写入串行端口(每100ms一次)。计时器的回调方法如下所示:- if (_timerTaskRunning) { Debug.WriteLine("still running"); return; } _timerTaskRunning = true; ... do the serial write/read here ... _timerTaskRunning = false;
if (_timerTaskRunning)
{
Debug.WriteLine("still running");
return;
}
_timerTaskRunning = true;
... do the serial write/read here ...
_timerTaskRunning = false;
\u timerTaskRunning
标志是一种保护措施,可确保在前一个计时器“循环”未完成时(即耗时超过100ms),代理不会运行
当我第一次启动应用程序时,我看到了来自if
语句的十几条调试消息。然后它会稳定下来,但我会在7或8秒后看到另一组消息。它再次稳定下来,每隔一段时间我就会看到一组不同数量的消息出现
我假设第一组消息是由计时器委托运行缓慢引起的,因为应用程序仍在启动、对象/UI初始化等,而后续消息可能是由垃圾收集频繁传入并减慢速度引起的?它不是串行端口,因为我看到了与“模拟”串行端口相同的行为
我已经尝试将计时器的第一次运行延迟几秒钟,但是没有任何区别——在计时器启动后的第一秒钟左右,我仍然收到一批调试消息。跳过一些计时器任务并不是世界末日,但知道是什么导致了它们会很有趣。我是否可以做些什么来进一步调查原因,例如perfmon是否可以解释一些事情?我以前没有使用过它,所以您建议使用哪种计数器?您的
\u timerTaskRunning
会被多个线程更新。您需要使用锁定来确保线程安全
然而,我根本不会使用计时器。我已经实现了一个非renetrant计时器。它使用带超时的
AutoResetEvent
WaitOne确保不返回。听起来好像您有返回问题。基本上,由于比赛条件的原因,你的timerTaskRunning没有起到保护作用
如果有多个线程可以调用start,则需要同步对它的调用 你在这里做什么。。。在此处执行串行写入/读取…?您的读取/写入代码仍然可以同时在两个单独的线程上执行。@图标“是”,在这里我写入串行端口,然后读取一个值。正如我在问题中提到的,并不是串行通信导致了下降,因为我使用一个简单的“mock”类得到了相同的行为。System.Timers.Timer肯定会导致更干净的代码。非常感谢。