在C#
,我们何时应该使用WaitHandle
代替lock
?
答案 0 :(得分:4)
锁定与WaitHandle
根本不同。用你写的锁,例如:
lock (SomeResource)
{
// do stuff here
}
第一行说“我想要对该资源进行独占访问”,并将等到该资源可用(即没有其他人对其进行锁定)。然后代码运行,最后锁定被释放,以便其他人可以使用它。
WaitHandle
用于等待某些事件发生。当你写:
MyWaitHandle.WaitOne();
您的代码正在等待某个其他线程(可能在不同的进程中)发出WaitHandle
的信号。它发出的信号可能是任何东西。也许你正在等待另一个线程完成它的工作并在你的代码可以继续之前说“我现在已经完成了”。
因此,要回答您的问题,您应该在想要获得对资源的独占访问权时使用锁定。当您想要收到某些事件的通知时,您应该使用WaitHandle
。
答案 1 :(得分:2)
WaitHandle可以等待多个句柄,锁只能等待一个句柄。
答案 2 :(得分:2)
当你需要它时。说真的,锁是Monitor
的语法糖,它可能在内部使用WaitHandles。
只有在需要更多灵活性时才使用它(例如,持有比当前范围更长的锁...)或以正确的顺序管理多个锁等。
答案 3 :(得分:2)
他们完成了完全不同的事情。 lock
用于将对特定代码块的访问限制为一次单个线程。 WaitHandle
是几个与并发相关的类的基类,例如Semaphore
,Mutex
,AutoResetEvent
和ManualResetEvent
,它们允许您控制并发性以略微不同的方式。例如,Semaphore
允许您将并发限制为不超过 N 线程,而不是单个线程。
答案 4 :(得分:1)
WaitHandle
。如果要防止多个线程同时访问共享资源,将使用lock
。
答案 5 :(得分:0)
最好的解释在于这两个链接。不幸的是,你将不得不做一些阅读以获得你问的问题类型的完整答案:
这也包含一个例子: http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx