首页 > 解决方案 > Timer.Change 有多贵?

问题描述

考虑一个具有性能敏感、高度并行的 C# 处理管道的服务器,如果某些事情停止发生(例如媒体流),我们希望在其中引发一个事件。

一种理论上的方法是创建一个由管道连续延迟的计时器。举个简单的例子:

const int IDLE_MILLIS = 1000; // 1 second

Timer timer = new Timer(IDLE_MILLIS, () =>
{
   Console.WriteLine("Pipeline is idle.");
});

void ProcessMediaFrame(MediaFrame frame)
{
    timer.Change(IDLE_MILLIS, Timeout.Infinite);

    // pipeline is not idle
}

这里的方法有多贵Change?(https://docs.microsoft.com/en-us/dotnet/api/system.threading.timer.change

空闲时是否Timer消耗任何资源?

标签: c#performancetimer

解决方案


源代码中的性能说明(感谢 Codexer 链接正确的文件)说您的案例正是他们优化的内容。

我们假设定时器被频繁地创建和销毁,但很少真正触发。

...

  • 操作超时...几乎从不触发,因为重点是计时器仅在出现问题时触发。

推荐阅读