Synclock和WaitOne之间的区别

时间:2011-09-08 13:11:28

标签: .net multithreading asynchronous synclock

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

的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 它支持简单的超时。

但它不再起作用了。可能是故障在代码中的其他位置。我的主要问题是,使用SyncLockWaitOne作为基本服务员标志有区别吗?

此致

2 个答案:

答案 0 :(得分:4)

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

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

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

但是,如果您确定需要锁的语义(通过SyncLockMonitor类),那么您可以使用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方法时发出信号。