2011-07-15 25 views
3

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

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

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

+2

如果你正在寻找一个比这比较是最好的文章在那里。 [比较.NET Framework类库中的计时器类](http://msdn.microsoft.com/zh-cn/magazine/cc164015.aspx) –

+0

对象过期后会发生什么?他们变成垃圾吗? – trendl

+1

为什么不在对象中使用带有'events'的信号呢?每个到期的对象都会发出“我已经过期”的信号,并且此事件的每个订阅者都会有准时数据,而不是每10秒钟的数据。 –

回答

1

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

我还会制作一个对象列表并在定时器方法中遍历它。这是一个很好的方法,并且很难实现(保持简单和愚蠢)

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

4

我不会创造那么多定时器,因为它会是开销。

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

如果你有200个元素,第一个将在2秒内过期,你可以有一个2秒的计时器,无论最后一个元素将在2年左右到期...

+0

+1这看起来像是最有效的解决方案。只要您遍历集合来扫描旧项目,请记下下一个最旧的项目,并将该值用于计时器的下一个时间间隔。 – Groo

+0

有趣的想法。一个计时器与集合中的每个对象连接到事件。如果我可以将事件发送到更好的正确对象。 – Noel

1

因为我假设过期时对象不能真正“自毁”,所以我会使用单个静态Timer来检查对象是否已过期,并在从集合中删除对象之前对其进行处理。

System.Timers.Timer对此任务很有用,只要确保将所有内容都包含在try..catch之内,因为单个未被捕获的错误会导致计时器停止滴答,并且您甚至不会收到任何通知。

0

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

例如 OBJ1,在届满12时35分01秒 OBJ 2,在12时37分14秒 OBJ 3期满后,在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)当定时器调整时,从增量列表中删除第一个条目,并执行源集合中的对象所需的任何操作。

返回一个

当一个项目被添加到集合,你需要在正确的位置添加一个新条目增量列表。不是太复杂,但允许计时器在加入过程中弹出。

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

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

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

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

在改变任何东西之前,当前的实现是否会引发任何问题?

只有在需要时才会从计时器弹出,并且无需每次扫描列表时都会得到性能提升。我们在谈论100条还是100,000条?性能颠簸会显着吗?

您将不再有任何'延迟'到期(在超时后从列表中删除)。这很重要吗?

心连心, 艾伦