5

C#,什么时候我们应该使用WaitHandle而不是lock

4

6 回答 6

6

锁与WaitHandle. 使用您编写的锁,例如:

lock (SomeResource)
{
    // do stuff here
}

第一行说,“我想要对该资源的独占访问权”,并将等到该资源可用(即没有其他人锁定它)。然后代码运行,最后锁被释放,以便其他人可以使用它。

WaitHandle用于等待某个事件发生。当你写:

MyWaitHandle.WaitOne();

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

因此,要回答您的问题,当您想要获得对资源的独占访问权限时,您应该使用锁。WaitHandle当您想收到某些事件的通知时应该使用。

于 2011-04-29T13:57:58.190 回答
3

当你需要它的时候。说真的, lock 是语法糖Monitor,它可能在内部使用 WaitHandles。

仅当您需要更大的灵活性时才使用它(例如,持有比当前范围更长的锁......)或以正确的顺序管理多个锁等。

于 2011-04-29T13:36:21.373 回答
3

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

于 2011-04-29T13:43:20.583 回答
2

一个 WaitHandle 可以等待多个句柄,一个锁只能等待一个。

于 2011-04-29T13:36:00.467 回答
1

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

于 2011-04-29T13:42:13.233 回答
0

最好的解释在于这两个环节。不幸的是,您将不得不做一些阅读才能获得对您提出的问题类型的完整答案:

这也包含一个示例:http: //msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx

http://msdn.microsoft.com/en-us/library/kad9xah9.aspx

于 2011-04-29T13:59:21.250 回答