在C#中,我们何时应该使用
WaitHandle
而不是lock
?锁与WaitHandle
在本质上是不同的。使用锁时,您可以编写如下代码:
lock (SomeResource)
{
// do stuff here
}
WaitHandle
用于等待某个事件发生。当您编写:MyWaitHandle.WaitOne();
你的代码正在等待其他线程(可能是不同进程中的线程)发出WaitHandle
信号。它所发出的信号可以是任何东西。也许你正在等待另一个线程完成工作并说:“我现在完成了”,然后你的代码才能继续。
因此,回答你的问题,当你想要获得对资源的独占访问时,应该使用锁。当你想要被通知某个事件时,应该使用WaitHandle
。
当你需要的时候。严肃地说,锁是一种语法糖,它与Monitor
类似,可能在内部使用WaitHandles。
只有在需要更多灵活性(例如保持锁的时间长于当前作用域等)或正确管理多个锁的顺序等情况下才使用它。
lock
用于限制对特定代码块的访问,一次只能有一个线程。一个WaitHandle
是几个与并发相关的类的基类,例如Semaphore
,Mutex
,AutoResetEvent
和ManualResetEvent
,它们允许您以稍微不同的方式控制并发。例如,Semaphore
允许您将并发限制为不超过N个线程,而不是单个线程。WaitHandle
通常用于在有多个线程运行时,您希望等待其中一个或全部线程完成后再继续执行其他操作。如果您想要防止多个线程同时访问共享资源,则应使用lock
。