我如何有效地使用计时器

时间:2011-07-15 08:04:27

标签: c# .net timer

我有一些物品在一段时间后过期。现在我正在使用Single计时器每隔10秒引发一次事件并通过对象集合运行,看看是否有任何事件已经过期。

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

我有一个测试装备,所以我将能够比较我现在拥有的和重构的实现,但我想在开始之前我认为这是一个好主意。

4 个答案:

答案 0 :(得分:4)

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

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

如果您有200个元素且第一个将在2秒内到期,那么无论最后一个元素将在2年左右到期,您都可以拥有2秒的计时器...

答案 1 :(得分:1)

由于我假设对象在过期时无法真正“自毁”,我会使用单个静态Timer检查哪些对象已过期,并在从集合中删除之前对其进行处理。

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

答案 2 :(得分:1)

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

我还会创建一个对象列表并在timer方法中遍历它。这是一种合理的方法,并不是很难实现(Keep It Simple and Stupid)

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

答案 3 :(得分:0)

您是否有设置到期时间的对象列表?

e.g。     obj1,于12:35:01到期     obj2,于12:37:14到期     obj3,于12:38:56到期     obj4,于12:43:44到期

如果我们知道创建集合的到期时间,我们可以使用单个计时器和间隔列表在需要删除对象时触发计时器

e.g。

             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)当计时器触发时,从delta列表中删除第一个条目,并对源集合中的对象执行任何需要处理的操作。

回到A

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

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

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

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

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

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

只有在需要时才会从定时器弹出中获得性能提升,并且每次都不必扫描列表。我们在谈论100个条目还是10万个?性能提升是否会引人注目?

您将不再有任何'迟到'的到期日(在他们超时后从名单中删除)。这有关系吗?

HTH, 艾伦