【问题标题】:.NET Stopwatch Class limitations.NET 秒表类限制
【发布时间】:2010-10-14 10:32:23
【问题描述】:

这可能不是一个完全不与 .NET 相关的问题。 我正在编写一个 .NET 应用程序来控制一些小工具。我定期向小工具发送命令(比如每 500 毫秒)。一旦我发送命令,我就会启动一个计时器。 (.NET 秒表类)

如果小工具在 10 毫秒内没有响应,我会再次发送命令。如果它确实响应,我会继续通过发送更多命令并处理响应来监控小工具状态。

我有 2 或 3 个秒表计时器并行运行,以便为这个小工具做其他事情。

现在,我想监视和控制可能有数千个这样的小工具(可能高达 5000 个)。如果我为一个小工具创建一个对象,我将查看 10000 到 15000 个并行运行的秒表对象。我不确定秒表是如何工作的,但我认为它们依靠硬件计时器或类似的东西来跟踪时间。

我的问题是,windows 可以同时处理这么多的秒表吗?

【问题讨论】:

  • 你知道,我很好奇:你要如何将 5000 台设备连接到一台计算机?
  • 它们是菊花链式的! 12个小工具连接到一个接口盒。每个盒子可以菊花链到其他 4 个盒子等等。每个小工具在这个层次结构中都有一个唯一的可寻址 ID。

标签: .net windows hardware-interface stopwatch


【解决方案1】:

我建议重新考虑这种设计。首先,秒表只是按照它所说的去做——它就像一个秒表。如果您希望某个事件以特定的时间间隔触发,您需要查看各种 Timer 类。

话虽如此,我还是建议您在小工具之间共享您的计时器。您会发现,如果您创建的单个调度程序使用的计时器更少,并且调度程序管理小工具,那么一切都执行得更好,并且可能更易于编写和理解。

【讨论】:

    【解决方案2】:

    秒表只是一个保存 Windows API 调用QueryPerformanceCounter() 结果的变量,它在“运行”时没有开销。停止它再次调用QueryPerformanceCounter(),所以性能应该没问题。也就是说,我同意 Reed Copsey,你需要重新考虑你的设计。有了这么多的小工具,我会开始考虑设备驱动程序。

    【讨论】:

      【解决方案3】:

      我认为问题应该是您是否可以处理多个计时器;你会浪费很多时间仅仅阅读数千个计时器而不做任何功能。

      我不知道 Stopwatch 类背后的实现,但我可以想象他们只是在开始和停止时读取计时器的值。所以一个 Stopwatch 实例可能几乎不需要任何资源。

      但是试试看吧;在循环中生成一个包含数千个实例的数组,启动它们,看看会发生什么。

      【讨论】:

        【解决方案4】:

        考虑保存小工具响应的全局队列和一个或几个查询队列并在需要时重新发送消息的线程。它会表现得更好。

        【讨论】:

          【解决方案5】:

          使用一个时间源以指定的时间间隔安排事件

          【讨论】:

            【解决方案6】:

            秒表类非常简单。它不是一直在“运行”的东西。当你告诉它开始时,它会查看系统时间,而当你告诉它暂停、停止、重置等时,它只是在每次执行此操作时查看系统时间。询问 ElapsedMilliseconds 相当于说 (Processor.CurrentTicks - StartTicks) / TicksPerMillisecond。这很简单,真的。系统可以处理大量此类问题。

            我不评论这是否适合您的问题,只是回答您的问题:系统可以毫无问题地处理数千个秒表。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-06-17
              • 2011-03-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-02-13
              • 2011-06-26
              相关资源
              最近更新 更多