2

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

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

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

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

我的问题是,windows 可以同时处理如此大量的秒表吗?

4

6 回答 6

8

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

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

于 2009-03-19T22:29:42.783 回答
7

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

于 2009-03-19T22:32:51.530 回答
0

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

于 2009-03-19T22:49:35.140 回答
0

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

于 2009-03-19T22:52:29.767 回答
0

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

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

于 2012-10-10T09:11:44.647 回答
0

我认为问题应该是您是否可以处理多个计时器;您将浪费大量时间阅读数千个计时器并且不执行任何功能。

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

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

于 2009-03-19T22:35:03.257 回答