我想实现一个集合(List
或Dictionary
),其中的条目会在一段时间后过期:当条目过期时,它应该自动从集合中删除。
我读了this question的答案,该答案建议使用后台线程来检查和删除过期的项目。相反,this answer中提出的解决方案涉及使用Timer
。
由于Timer
是在一个单独的线程上调用的,因此在permormance方面使用第二个解决方案的优势是什么?
答案 0 :(得分:1)
定时器通常优于将整个线程专用于任务,因为它们通常通过允许共享相关线程的某种机制来实现。例如,System.Windows.Forms.Timer
类使用WM_TIMER
窗口事件,这是一个自动生成的事件,当计时器间隔过去时,您的UI线程的消息泵将接收该事件(即计时器事件是总是在UI线程中加注)。 System.Threading.Timer
和System.Timers.Timer
计时器使用单个(或少量)线程来管理多个计时器。
根据您的场景,使用System.Windows.Forms.Timer
类有一个优点(如上所述):在UI线程中引发了已发生的事件。如果您的集合以某种方式绑定到UI,这可能很有用,因此更改它也需要更新UI。
如果这个优势适用于您,并且如果您使用的是.NET 4.5,我建议您使用Task.Delay()
方法代替async
方法,因为恕我直言,它是一种更易读的实现方式同样的行为。
实际上,即使在您不需要在UI线程中引发已过去的事件的其他场景中,您实际上也可以使用Task.Delay()
;在这种情况下,如果从UI线程调用,您可能希望将.ConfigureAwait(false)
添加到调用中,以便Task
库不会浪费在UI线程上执行延续的工作(可能不会#39;伤害任何东西,但如果不需要,最好不要这样做。)
请注意,上述内容都是相当广泛的概括。如果没有关于您的确切方案的具体细节,那么提供比这更具体的东西是不可能的。