3

我使用了一个线程管理的服务员。

同步锁 http://msdn.microsoft.com/en-us/library/3a86s51t%28v=vs.71%29.aspx

但是现在,我想暂停一下,然后找到了 WaitOne。

WaitOne http://msdn.microsoft.com/en-us/library/system.threading.waithandle.waitone.aspx 支持简单的超时。

但它不再起作用了。可能是代码中的其他地方出现了错误。SyncLock我的主要问题是,使用和WaitOne作为基本服务员标志有区别吗?

问候

4

2 回答 2

4

SyncLockMonitor.Enter是和的特定语言包装器Monitor.Exit。它旨在用于限制同时访问代码或资源的关键部分。

WaitHandle.WaitOne是一种方法,旨在用于线程应该等待外部信号的场景。它如何工作的确切实现和语义是特定于类的。换句话说,与 a或相比,WaitOne从 a 使用时的行为会有所不同。AutoResetEventManualResetEventSemaphore

两者确实针对不同的用例。如果没有更好地描述您的具体问题,甚至很难推测哪个最适合使用。

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

于 2011-09-08T13:19:50.420 回答
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 方法时,会发出事件信号。

于 2011-09-08T13:22:26.733 回答