使用 ElapsedEventHandler 自动从集合中删除元素
Using ElapsedEventHandler for automatically remove element from a collection
我想实现一个集合(List
或 Dictionary
),其中的条目会在一段时间后过期:当条目过期时,它应该自动从集合中删除。
我阅读了 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.Timer
和 System.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] 上执行延续=] 线程(可能不会造成任何伤害,但是当不需要时,最好不要)。
请注意,以上内容都是相当广泛的概括。如果没有关于您的精确场景的具体细节,就不可能提供比这更具体的内容。
我想实现一个集合(List
或 Dictionary
),其中的条目会在一段时间后过期:当条目过期时,它应该自动从集合中删除。
我阅读了 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.Timer
和 System.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] 上执行延续=] 线程(可能不会造成任何伤害,但是当不需要时,最好不要)。
请注意,以上内容都是相当广泛的概括。如果没有关于您的精确场景的具体细节,就不可能提供比这更具体的内容。