C# 如何有效地使用计时器

C# 如何有效地使用计时器,c#,.net,timer,C#,.net,Timer,我有一些对象在一段时间后过期。现在,我正在使用一个计时器每10秒引发一个事件,并运行对象集合,查看是否有任何内容已过期 与此相反,我正在考虑为每个对象添加一个计时器,并将其设置为触发一个在所需时间过期的事件。 我认为最合适的计时器是System.Timers.timer 有人对此有什么想法吗 我有一个测试平台,所以我可以比较我现在拥有的和重构后的实现,但在我开始之前,我想这是一个好主意。我不会创建那么多计时器,因为这会带来开销 也许最好有一个计时器。现在这个计时器不应该每10秒触发一次,它应该在

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

与此相反,我正在考虑为每个对象添加一个计时器,并将其设置为触发一个在所需时间过期的事件。 我认为最合适的计时器是
System.Timers.timer
有人对此有什么想法吗


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

我不会创建那么多计时器,因为这会带来开销

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


如果有200个元素,第一个元素将在2秒内过期,那么不管最后一个元素将在2年左右过期,你都可以有一个2秒的计时器…

因为我假设对象在过期时不会真正“自毁”,我会使用单个静态计时器检查哪些对象已过期,并在从集合中移除之前对其进行处理


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

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

我还将创建一个对象列表,并在timer方法中遍历它。这是一个合理的方法,实施起来并不困难(保持简单和愚蠢)


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

您是否有一个具有设置到期时间的对象列表

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

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

e、 g

A) 偷看“增量列表”中的第一个条目(我以前听过它叫这个,但不能给你引证),并将计时器间隔设置为等待时间

B) 当定时器触发时,从增量列表中删除第一个条目,并对源集合中的对象执行任何需要执行的操作

回到

将项目添加到集合时,您需要在正确的位置向增量列表添加新条目。不是过于复杂,但允许计时器弹出,而你正在添加中。 优点: 只有一个计时器。这就是你所需要的。每个对象的计时器将占用大量资源

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

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

缺点: 实现起来比在计时器上扫描整个集合更复杂

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

只有在需要时,计时器才会弹出,并且不必每次都扫描列表,这将提高性能。我们说的是100条还是100000条?性能的提升会很明显吗

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

嗯,,
艾伦

如果你想比较一下,这篇文章是最好的。对象过期后会发生什么情况?它们会变成垃圾吗?为什么不在对象中使用带有
事件的信令呢?每个过期的对象都会发出“我现在过期了”的信号,此事件的每个订阅者都会有实时数据,而不是每10秒一次的数据。当对象因未及时完成分配的任务而过期时。目前,我正在重新使用对象重置过期时间,并重新启动其处理作业。让对象过期的想法是我想用计时器实现的。除此之外,该对象如何知道何时进行epire?+1这看起来是最有效的解决方案。每当您遍历集合以扫描旧项目时,记下下下一个最旧的项目,并将该值用于计时器的下一个间隔。这是一个有趣的想法。一个计时器,集合中的每个对象都连接到事件。如果我能将事件发送到正确的对象,那就更好了。
             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