Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net应用程序线程/计时器性能_C#_Multithreading - Fatal编程技术网

C# .Net应用程序线程/计时器性能

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;

我正在开发一个启动System.Threading.Timer的应用程序,它可以相当快速地读取/写入串行端口(每100ms一次)。计时器的回调方法如下所示:-

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没有起到保护作用

  • 使用而不是System.Threading.Timer
  • 将Timer.AutoReset设置为false。这将解决您的迷人问题,因为它不会给您回电话,直到您明确希望它回电话
  • 当需要计时器再次运行时,调用它的Start()(可能需要调整间隔以考虑执行时间)

  • 如果有多个线程可以调用start,则需要同步对它的调用

    你在这里做什么。。。在此处执行串行写入/读取…?您的读取/写入代码仍然可以同时在两个单独的线程上执行。@图标“是”,在这里我写入串行端口,然后读取一个值。正如我在问题中提到的,并不是串行通信导致了下降,因为我使用一个简单的“mock”类得到了相同的行为。System.Timers.Timer肯定会导致更干净的代码。非常感谢。