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

Using ElapsedEventHandler for automatically remove element from a collection

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

我阅读了 this question, which proposed to use a background thread to check and remove the expired items. Instead, the solution proposed in this answer 的答案涉及 Timer 的使用。

由于 Timer 是在单独的线程上调用的,使用第二种解决方案比使用第一种解决方案在性能方面有什么优势?

定时器通常比将整个线程专用于任务更可取,因为它们通常是通过某种允许共享相关线程的机制实现的。例如,System.Windows.Forms.Timer class 使用 WM_TIMER windows 事件,这是一个 auto-generated 事件,您的 UI 线程的消息泵将在计时器间隔结束(即计时器事件总是在 UI 线程中引发)。 System.Threading.TimerSystem.Timers.Timer 计时器使用单个(或少量)线程来管理多个计时器。

根据您的情况,使用 System.Windows.Forms.Timer class 有一个优点(如上所述):在 UI 线程中引发了经过的事件。如果您的 collection 以某种方式绑定到 UI,那么对它的更改也需要更新 UI。

如果该优势适用于您,并且您使用的是 .NET 4.5,我会建议在 async 方法中使用 Task.Delay() 方法,恕我直言,这是一种更易读的方式实现相同的行为。

事实上,即使在不需要在 UI 线程中引发 elapsed 事件的其他场景中,您实际上也可以使用 Task.Delay();在这种情况下,如果从 UI 线程调用,您需要将 .ConfigureAwait(false) 添加到调用中,这样 Task 库就不会浪费精力在 [=35] 上执行延续=] 线程(可能不会造成任何伤害,但是当不需要时,最好不要)。

请注意,以上内容都是相当广泛的概括。如果没有关于您的精确场景的具体细节,就不可能提供比这更具体的内容。