我有一些物品在一段时间后过期。现在我正在使用Single计时器每隔10秒引发一次事件并通过对象集合运行,看看是否有任何事件已经过期。
而不是这个,我正在考虑为每个对象添加一个计时器,并将其设置为触发事件在所需的时间到期。
我认为最合适的计时器是System.Timers.Timer
有没有人对此有任何想法?
我有一个测试装备,所以我将能够比较我现在拥有的和重构的实现,但我想在开始之前我认为这是一个好主意。
答案 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, 艾伦