这可能不完全不是.NET相关的问题。 我正在编写一个.NET应用程序来控制一些小工具。我定期向小工具发送命令(比如每500毫秒)。一旦我发送命令,我就会启动一个计时器。 (.NET秒表类)
如果小工具在10毫秒内没有响应,我会再次发送命令。如果确实响应,我会继续通过发送更多命令和处理响应来监控小工具状态。
我有2个或3个秒表计时器并行运行,为这个小工具做其他事情。
现在,我想监视和控制可能数以千计的这些小工具(可能高达5000)。如果我为小工具创建一个对象,我将查看并行运行的10000到15000个秒表对象。我不确定秒表是如何工作的,但我认为他们依靠硬件计时器或某些东西来跟踪时间。
我的问题是,Windows可以同时处理如此大量的秒表吗?
答案 0 :(得分:8)
我建议重新考虑这个设计。首先,秒表只是做它所说的 - 它就像一个秒表。如果您希望以特定间隔触发事件,则需要查看各种Timer类。
话虽如此,我建议您在小工具中分享您的计时器。您会发现一切都表现得更好,如果您创建的单个调度程序使用的计时器更少,并且调度程序管理小工具,则编写和理解可能更简单。
答案 1 :(得分:7)
秒表只是一个包含Windows API调用QueryPerformanceCounter()
结果的变量,它在“运行”时没有开销。停止再次呼叫QueryPerformanceCounter()
,因此性能应该没问题。也就是说,我同意Reed Copsey,你需要重新考虑你的设计。有了这么多的小工具,我就开始考虑设备驱动程序了。
答案 2 :(得分:0)
我认为问题应该是你能处理多个计时器;你会浪费很多时间阅读数以千计的计时器并且没有任何功能。
我不知道秒表课程背后的实现,但我可以想象他们只是在开始和停止时再次读取计时器的值。因此,秒表实例可能几乎不需要任何资源。
但是试试看吧;在循环中生成一些thousend实例的数组,启动它们,看看会发生什么。
答案 3 :(得分:0)
考虑保存小工具响应的全局队列以及查询队列的一个或几个线程,并在需要时拒绝消息。它会表现得更好。
答案 4 :(得分:0)
使用一个时间源以指定的时间间隔安排事件
答案 5 :(得分:0)
秒表课很简单。它不是一直“运行”的东西。当你告诉它开始时,它会查看系统时间,当你告诉它暂停,停止,重置等时,只需查看每次执行此操作时的系统时间。询问ElapsedMilliseconds相当于说(Processor.CurrentTicks - StartTicks)/ TicksPerMillisecond。真的很简单。系统可以处理大量这些。
我没有评论这是否是适合您问题的设计,只是回答您的问题:系统可以毫无问题地处理数千个秒表。