何时应该使用WaitHandle而不是锁定?

6
在C#中,我们何时应该使用WaitHandle而不是lock
6个回答

7

锁与WaitHandle在本质上是不同的。使用锁时,您可以编写如下代码:

lock (SomeResource)
{
    // do stuff here
}

第一行代码意思是,“我想要独占地访问该资源”,将等待该资源可用(即没有其他人锁定它)。然后代码运行,在结尾处释放锁定,以便其他人可以使用它。 WaitHandle 用于等待某个事件发生。当您编写:
MyWaitHandle.WaitOne();

你的代码正在等待其他线程(可能是不同进程中的线程)发出WaitHandle信号。它所发出的信号可以是任何东西。也许你正在等待另一个线程完成工作并说:“我现在完成了”,然后你的代码才能继续。

因此,回答你的问题,当你想要获得对资源的独占访问时,应该使用锁。当你想要被通知某个事件时,应该使用WaitHandle


1
+1 对于最后两行,这是选择何种方法的明确标准(通常很清楚应该使用哪个)。 - Xaqron

3

当你需要的时候。严肃地说,锁是一种语法糖,它与Monitor类似,可能在内部使用WaitHandles。

只有在需要更多灵活性(例如保持锁的时间长于当前作用域等)或正确管理多个锁的顺序等情况下才使用它。


3
它们完成完全不同的事情。一个lock用于限制对特定代码块的访问,一次只能有一个线程。一个WaitHandle是几个与并发相关的类的基类,例如SemaphoreMutexAutoResetEventManualResetEvent,它们允许您以稍微不同的方式控制并发。例如,Semaphore允许您将并发限制为不超过N个线程,而不是单个线程。

“完全不同”的事物通常不涉及一个事物是另一个事物的子集。它们在概念上相关,使用可以重叠。它们都涉及访问代码块。信号量限制对不超过N个线程的访问。如果N为1,则功能类似于锁定。显然,WaitHandle涵盖了广泛的内容,但处理并发领域。如果您要向只知道锁定的人教授WaitHandles,您不会禁止思维的桥梁,而是从它开始。 - Josh Sutterfield

2
一个 WaitHandle 可以等待多个处理程序,一个锁只能等待一个。

1

WaitHandle通常用于在有多个线程运行时,您希望等待其中一个或全部线程完成后再继续执行其他操作。如果您想要防止多个线程同时访问共享资源,则应使用lock


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接