什么时候使用AutoResetEvent和ManualResetEvent代替Monitor.Wait()/ Monitor.Pulse()?

时间:2020-03-06 14:58:50  来源:igfitidea点击:

他们似乎都实现了相同的目的。我什么时候会选择一个?

解决方案

当线程正在等待多个事件之一或者全部在做某事时,请使用事件。

如果要通过限制可以访问多少线程来限制对数据结构的访问,请使用监视器。

监视器通常保护资源,而事件告诉我们正在发生的事情,例如应用程序关闭。

此外,可以命名事件(请参见OpenExisting方法),这使它们可以用于跨不同进程的同步。

本教程详细介绍了我们需要了解的内容:
http://www.albahari.com/threading/

特别是,这将涵盖XXXResetEvent类,
http://www.albahari.com/threading/part2.aspx

这将涵盖Wait / Pulse:
http://www.albahari.com/threading/part4.aspx#_Wait_and_Pulse

我认为,最好使用Monitor,Monitor.Wait和Monitor.Pulse / PulseAll用于在线程之间进行信号传递(与Manual / AutoResetEvent一样),但是Monitor更快,并且不使用本机系统资源。 Monitor也显然是在用户模式下实现并进行管理的,而Manual / AutoResetEvents需要切换到内核模式并p /调用使用等待句柄的本机win32调用。

在某些情况下,我们可能需要使用Manual / AutoResetEvent,例如,在可以使用命名事件的进程之间发信号,而我想在应用中发出本机线程的信号。

我只是反省我在这篇关于线程的出色文章中所读到的内容。

整篇文章值得一读,但是该链接将我们带到等待句柄部分,其中详细介绍了事件并监视等待/脉冲。