使用ElapsedEventHandler自动从集合中删除元素

时间:2015-02-19 14:31:46

标签: c# .net multithreading timer

我想实现一个集合(ListDictionary),其中的条目会在一段时间后过期:当条目过期时,它应该自动从集合中删除。

我读了this question的答案,该答案建议使用后台线程来检查和删除过期的项目。相反,this answer中提出的解决方案涉及使用Timer

由于Timer是在一个单独的线程上调用的,因此在permormance方面使用第二个解决方案的优势是什么?

1 个答案:

答案 0 :(得分:1)

定时器通常优于将整个线程专用于任务,因为它们通常通过允许共享相关线程的某种机制来实现。例如,System.Windows.Forms.Timer类使用WM_TIMER窗口事件,这是一个自动生成的事件,当计时器间隔过去时,您的UI线程的消息泵将接收该事件(即计时器事件是总是在UI线程中加注)。 System.Threading.TimerSystem.Timers.Timer计时器使用单个(或少量)线程来管理多个计时器。

根据您的场景,使用System.Windows.Forms.Timer类有一个优点(如上所述):在UI线程中引发了已发生的事件。如果您的集合以某种方式绑定到UI,这可能很有用,因此更改它也需要更新UI。

如果这个优势适用于您,并且如果您使用的是.NET 4.5,我建议您使用Task.Delay()方法代替async方法,因为恕我直言,它是一种更易读的实现方式同样的行为。

实际上,即使在您不需要在UI线程中引发已过去的事件的其他场景中,您实际上也可以使用Task.Delay();在这种情况下,如果从UI线程调用,您可能希望将.ConfigureAwait(false)添加到调用中,以便Task库不会浪费在UI线程上执行延续的工作(可能不会#39;伤害任何东西,但如果不需要,最好不要这样做。)

请注意,上述内容都是相当广泛的概括。如果没有关于您的确切方案的具体细节,那么提供比这更具体的东西是不可能的。