什么时候使用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,例如,在可以使用命名事件的进程之间发信号,而我想在应用中发出本机线程的信号。
我只是反省我在这篇关于线程的出色文章中所读到的内容。
整篇文章值得一读,但是该链接将我们带到等待句柄部分,其中详细介绍了事件并监视等待/脉冲。