Monitor.Enter和Monitor.Exit在不同的线程中

时间:2012-06-12 17:29:45

标签: c# .net multithreading locking

Monitor.EnterMonitor.Exit旨在从同一个线程调用。但是,如果我需要在一个不同于获得的线程中释放锁定呢?

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

3 个答案:

答案 0 :(得分:11)

您正在寻找的原语称为semaphore,可以在一个线程上安全地输入并从另一个线程退出。

答案 1 :(得分:7)

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

  

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

答案 2 :(得分:4)

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

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