繁体   English   中英

如何有效地使用计时器

[英]How do I efficently use timers

我有一些在一定时间后过期的对象。 现在,我正在使用单个计时器每 10 秒引发一次事件,并通过 object 集合运行,看看是否有任何内容过期。

取而代之的是,我正在考虑为每个 object 添加一个计时器,并将其设置为触发事件以在所需时间到期。 我认为最合适的计时器是System.Timers.Timer有人对此有任何想法吗?

我有一个测试台,所以我可以比较我现在拥有的和重构的实现,但我想在开始之前这是一个好主意。

我不会创建那么多计时器,因为它会产生开销。

也许最好有一个计时器。 现在这个计时器不应该每 10 秒触发一次,它应该在下一个元素到期时触发。 所以你有某种“及时触发”

如果您有 200 个元素并且第一个元素将在 2 秒内过期,那么您可以拥有 2 秒的计时器,而不管最后一个元素将在 2 年左右过期...

因为我假设对象在过期时不能真正“自毁”,所以我将 go 与单个 static 计时器检查哪些对象已过期,并在从集合中删除之前处理它们。

System.Timers.Timer非常适合这项任务,只需确保使用try..catch包装所有内容,因为单个未捕获的错误将导致计时器停止计时,您甚至不会收到任何通知。

我确实更喜欢System.Threading.Timer而不是您提到的那个。 原因是System.Timers.Timer将消耗所有未处理的异常,因此隐藏应用程序中的错误。

我还会制作一个对象列表并在计时器方法中遍历它。 这是一种合理的方法,实施起来并不难(保持简单和愚蠢)

不这样做的唯一原因是在恰好 10 秒(而不是 11 或 12 秒)后检查对象是否很重要。 这完全取决于每次执行需要多长时间。

你有设置过期时间的对象列表吗?

例如 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) 当计时器触发时,从增量列表中删除第一个条目,并使用源集合中的 object 执行任何需要执行的操作。

回到A

将项目添加到集合时,您需要将新条目添加到正确 position 中的增量列表中。 不太复杂,但允许在添加过程中弹出计时器。

优点:只有一个计时器。 这就是你所需要的。 每个 object 的计时器会占用大量资源。

您只需在启动时检查整个集合,然后在添加新项目时进行部分扫描。

永远不会错过到期。 这可能并不重要,但固定时间的检查意味着我们在移除某些项目时迟到了。

缺点:实现起来比简单地在计时器弹出时扫描整个集合更复杂。

在更改任何内容之前,当前的实现是否会导致任何问题?

仅在需要时才弹出计时器,并且不必每次都扫描列表,您将获得性能提升。 我们说的是 100 个条目还是 100,000 个条目? 性能提升会很明显吗?

您将不再有任何“延迟”到期(在超时后从列表中删除)。 这有关系吗?

hth,艾伦

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM