我使用了一个线程管理的服务生。
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作为基本的服务员标志有区别吗?
问候
发布于 2011-09-08 21:22:27
来自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-08 21:19:50
SyncLock是用于Monitor.Enter和Monitor.Exit的特定于语言的包装器。它旨在用于同时限制对代码或资源的临界区的访问。
WaitHandle.WaitOne是用于线程应该等待外部信号的场景中使用的方法。它如何工作的确切实现和语义是特定于类的。换句话说,与ManualResetEvent或Semaphore相比,在AutoResetEvent中使用WaitOne时,其行为将有所不同。
这两者实际上是针对不同的用例的。如果没有对您的具体问题的更好的描述,甚至很难推测哪一个是最好的。
但是,如果您确定需要锁的语义(通过SyncLock或Monitor类),则可以使用Monitor.TryEnter,它确实提供了超时参数。
https://stackoverflow.com/questions/7348592
复制相似问题