我使用线程管理的服务员。
的SyncLock 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
作为基本服务员标志有区别吗?
此致
答案 0 :(得分:4)
SyncLock
是Monitor.Enter
和Monitor.Exit
的语言特定包装器。它旨在用于限制同时访问代码或资源的关键部分。
WaitHandle.WaitOne
是一种旨在用于线程应等待外部信号的场景的方法。它的工作方式的确切实现和语义是特定于类的。换句话说,与WaitOne
或AutoResetEvent
相比,使用ManualResetEvent
时Semaphore
的行为会有所不同。
这两者确实针对不同的用例。如果没有更好地描述您的具体问题,甚至很难推测哪一个最适合使用。
但是,如果您确定需要锁的语义(通过SyncLock
或Monitor
类),那么您可以使用Monitor.TryEnter
来提供超时参数。
答案 1 :(得分:2)
来自MSDN http://msdn.microsoft.com/en-us/library/ms173179.aspx
使用锁或监视器可以防止同时发生 执行线程敏感的代码块,但这些构造确实如此 不允许一个线程将事件传递给另一个线程。这需要 同步事件,它们是具有两种状态之一的对象, 信号和未发信号,可用于激活和暂停 线程。线程可以通过等待a来暂停 同步事件是无信号的,可以通过激活 将事件状态更改为已发出信号。如果线程试图等待 一个已经发出信号的事件,然后线程继续 毫不拖延地执行。
有两种同步事件:AutoResetEvent和 ManualResetEvent的。它们的区别仅在于AutoResetEvent的变化 只要它激活一个线程,就会自动发出信号。 相反,ManualResetEvent允许任意数量的线程 由其信号状态激活,并且只会恢复为无信号状态 调用其Reset方法时的状态。
可以通过调用其中一个等号来使线程等待事件 方法,如WaitOne,WaitAny或WaitAll。 WaitHandle.WaitOne() 导致线程等待,直到单个事件发出信号, WaitHandle.WaitAny()阻塞一个线程,直到指示一个或多个 事件变为信号,WaitHandle.WaitAll()阻塞该线程 直到所有指示的事件都发出信号。事件变成了 调用其Set方法时发出信号。