他们两个似乎满足同样的目的。当我选择了一个?

有帮助吗?

解决方案

当你有一个等待一个或所有许多事件的线程做某事时,使用这些事件。

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

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

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

其他提示

在我看来,如果可以,最好使用Monitor,Monitor.Wait和Monitor.Pulse / PulseAll用于线程之间的信令(如手动/ AutoResetEvent)但是Monitor更快,并且不使用本机系统资源。显然,Monitor在用户模式下实现并进行管理,而Manual / AutoResetEvents需要切换到内核模式,并且p / invoke out到使用等待句柄的本机win32调用。

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

我只是在这篇优秀文章中反复阅读关于线程。

整篇文章值得一读,但链接会将您带到等待句柄部分,详细说明事件并监视等待/脉冲。

你会用一个 WaitHandle 当你想要一个线发送或接收的二元信号 没有 需要一个关键部分。 Monitor.WaitMonitor.Pulse 另一方面 需要 一个关键部分。最喜欢的同步机制在BCL有一些重叠,在何一两个你们提到的可以使用。但,不要认为它们实现同样的目的。

Monitor.WaitMonitor.Pulse 是一个更加原始的同步机制于一个地雷风险教育或是。实际上,你其实可以建立一个地雷风险教育或使用的没什么比 Monitor 类。最重要的概念了解是如何的 Monitor.WaitWaitHandle.WaitOne 方法有所不同。 WaitWaitOne 将把螺纹 WaitSleepJoin 状态,这意味着该线变得空闲和只有回应任何一个 Thread.Interrupt 或者各自的 PulseSet 呼叫。但是,这是一个重大的差别, Wait 会留下一个关键部分并且重新获得它 在原子的方式. WaitOne 只是不能这样做。这是一个差异,所以根本方式的这些同步机制的行为定义的情况下,它们可以使用。

在大多数情况下你会选择一个地雷风险教育或是。这些满足大多数情况下一个线程需要收到一个信号,是从另一个。然而,如果希望创建自己的信号机制,那么你就需要使用 WaitPulse.但是,再说一次。净BCL有最受欢迎的信号机制,复盖了。以下信号机制已经存在1.

  • ManualResetEvent(或ManualResetEventSlim)
  • AutoResetEvent
  • 信号灯(或SemaphoreSlim)
  • 安全访问
  • CountdownEvent
  • 阻挡

1一个光荣的说去 BlockingCollection 类。它不是一个信号机制本身,但它并有素质的一个信号机制,与增加的益处,可以附加数据的信号。在这种情况下的信号意味着一个项目是提供在收集和相关数据,信号是项目本身。

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

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

这将涵盖等待/脉冲: http://www.albahari.com/threading/part4.aspx#_Wait_and_Pulse

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top