我如何有效地使用计时器
本文关键字:计时器 有效地 | 更新日期: 2023-09-27 18:02:15
我有一些对象在一定时间后过期。现在,我使用单个计时器每10秒触发一个事件,并运行对象集合,看看是否有任何东西已经过期。
我正在考虑为每个对象添加一个计时器,并将其设置为触发一个事件,以便在所需的时间过期。我认为最合适的定时器是System.Timers.Timer
有人对此有什么看法吗?
我有一个测试设备,所以我将能够比较我现在拥有的和重构的实现,但在我开始之前我想这是一个好主意。
我不会创建那么多计时器,因为这会增加开销。
也许有一个计时器更好。现在这个计时器不应该每10秒触发一次,它应该在下一个元素过期时触发。所以你有一些"及时触发"
如果你有200个元素,第一个元素将在2秒内过期,你可以设置一个2秒的计时器,不管最后一个元素将在2年左右过期…
我更喜欢System.Threading.Timer
而不是你提到的那个。原因是System.Timers.Timer
将消耗所有未处理的异常,从而隐藏应用程序中的错误。
我还会创建一个对象列表,并在timer方法中遍历它。这是一个合理的方法,并不是很难实现(保持它简单和愚蠢)
不这样做的唯一原因是,如果重要的是在10秒后检查对象(而不是11或12秒)。
因为我认为对象在过期时不能真正"自毁",所以我会使用单个静态计时器检查哪些对象已经过期,并在从集合中删除之前处理它们。
System.Timers.Timer
适合此任务,只需确保用try..catch
包装所有内容,因为单个未捕获的错误将导致计时器停止滴答,您甚至不会得到任何通知。
您是否有一个设置了过期时间的对象列表?
。Obj1,在12:35:01到期Obj2,在12:37:14到期Obj3,在12:38:56到期Obj4,到期时间12:43:44
如果我们知道创建集合时的过期时间,我们可以使用单个计时器和间隔列表来在需要删除对象时触发计时器
。
Wait time in seconds To Be Removed
int1 12:35:01 - now() obj1
int2 12:37:14 - 12:35:01 obj2
int3 12:38:56 - 12:37:14 obj3
int4 12:43:44 - 12:38:56 obj4
A)偷看"增量列表"中的第一个条目(我以前听说过这个名字,但无法给你一个引用),并将计时器间隔设置为等待时间。
B)当计时器触发时,从增量列表中删除第一个条目,并对源集合中的对象执行任何需要执行的操作。
返回A
当一个项目被添加到集合中时,您需要在增量列表的正确位置添加一个新条目。不太复杂,但允许计时器弹出,当你在添加中间。
优点:只有一个定时器。这就是你所需要的。每个对象一个计时器会占用大量的资源。
您只需要在启动时检查整个集合,然后在添加新项目时进行部分扫描。
永远不要错过一个到期。这可能不重要,但一个固定的时间检查意味着我们在删除一些项目时迟到了。
缺点:实现起来比简单地扫描整个集合更复杂。
在更改任何内容之前,当前的实现是否会引起任何问题?
计时器只在需要时弹出,并且不必每次都扫描列表,这将使性能有所提高。是100个还是10万个?性能的提升会明显吗?
您将不再有任何"延迟"过期(在超时后从列表中删除)。这有关系吗?
hth,艾伦。