10

Monitor.Enter并且Monitor.Exit被设计为从同一个线程调用。但是,如果我需要在与获取的线程不同的线程中释放锁怎么办?

例如:有共享资源和使用该资源的异步操作。操作从共享资源开始BeginOperation并获取锁。还有EndOperation释放锁的方法。EndOperation通常在回调的另一个线程中调用,因此我无法调用Monitor.ExitEndOperation方法。在这种情况下,最好的方法是什么?仔细检查锁定AutoResetEvent而不是Monitor一个好的解决方案吗?

4

3 回答 3

13

您正在寻找的原语称为信号量,可以安全地进入一个线程并从另一个线程退出。

于 2012-06-12T17:33:45.747 回答
7

如果您可以使用 .NET 4.0,则可以将其替换为System.Threading.Semaphore,它允许您在一个线程中获取许可并在另一个线程中释放它们。

Semaphore 类在调用 WaitOne 或 Release 时不强制执行线程标识。

于 2012-06-12T17:33:23.067 回答
4

尝试使用ManualResetEvent,它用于阻止thead(s),直到某些外部事件被触发。MSDN 文档:

http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx

于 2012-06-12T17:34:28.540 回答