Synclock和WaitOne之间的区别

3

SyncLock = 进入锁定状态,WaitOne = 等待事件。它们没有任何共同点。 - Hans Passant
2个回答

4

SyncLockMonitor.EnterMonitor.Exit的语言特定封装。它旨在用于限制对代码或资源的关键部分的同时访问。

WaitHandle.WaitOne是一种方法,旨在用于线程等待外部信号的情况。它的实现和语义如何工作是类特定的。换句话说,当从AutoResetEventManualResetEventSemaphore中使用WaitOne时,它的行为将有所不同。

这两者实际上针对不同的用例。如果没有更好的描述您特定问题的方法,甚至很难猜测哪一个是最好使用的。

但是,如果您确定需要锁的语义(通过SyncLockMonitor类),则可以使用Monitor.TryEnter,该方法提供超时参数。


谢谢Brian。这已经很有意义了。我需要在处理帧的同时同步捕获的视频图像。例如将其转换为灰度。但它不是默认的帧序列,因为其他线程可能会引发事件以中断其他帧。据我所知,WaitOne将是我的解决方案。 - Nasenbaer

2

来自MSDN的文章http://msdn.microsoft.com/en-us/library/ms173179.aspx

使用锁或监视器有助于防止线程敏感代码块的同时执行,但这些构造不能允许一个线程向另一个线程通信事件。这需要同步事件,它们是具有两种状态(已标记和未标记)的对象,可用于激活和挂起线程。可以通过使线程等待未标记的同步事件来挂起线程,并且可以通过将事件状态更改为已标记来激活线程。如果线程尝试等待已经标记的事件,则线程继续执行而不延迟。

同步事件有两种类型:AutoResetEvent和ManualResetEvent。它们仅在AutoResetEvent在激活线程时自动从已标记更改为未标记方面存在差异。相反,ManualResetEvent允许其标记状态激活任意数量的线程,并且只有在调用其Reset方法时才会恢复为未标记状态。

通过调用其中一种等待方法(例如WaitOne、WaitAny或WaitAll),可以使线程等待事件。WaitHandle.WaitOne()使线程等待直到单个事件变为已标记,WaitHandle.WaitAny()阻塞线程直到一个或多个指定的事件变为已标记,WaitHandle.WaitAll()阻塞线程直到所有指定的事件变为已标记。当调用其Set方法时,事件变为已标记。


谢谢你的回答。看起来我对所谓的有信号线程上的 AutoResetEvents 不是很熟悉。也许我根本不理解英语单词。据我所知,区别在于 WaitOne 可以手动管理。 - Nasenbaer
是的,WaitOne会阻塞直到你在AutoResetEvent上调用Set()。例如,你可以从另一个线程或异步方法调用Set事件。这里是我使用的WaitOne示例链接。在示例中,WaitOne被用于阻塞,直到IE网页完成导航。https://dev59.com/SFvUa4cB1Zd3GeqPpgtn - JimSTAT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接