Reputation: 2200
Monitor.Enter
and Monitor.Exit
are designed to be called from the same thread. But, what if I need to release a lock in a different thread than acquired?
For example: there are shared resource and asynchronous operation that uses this resource. The operation begins with BeginOperation
and acquires the lock on the shared resource. There also the EndOperation
method that releases the lock. EndOperation
is typically called in another thread from a callback, thus I can't call Monitor.Exit
in the EndOperation
method. What is the best approach in this case? Will double-check locking with AutoResetEvent
instead of Monitor
be a good solution?
Upvotes: 12
Views: 6709
Reputation: 7452
The primitive you're looking for is called a semaphore which can be safely entered on one thread and exited from another.
Upvotes: 14
Reputation: 2895
Try using a ManualResetEvent, it's used to block thead(s) until some external event has been triggered. MSDN Doc:
http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx
Upvotes: 5
Reputation: 62439
If you can use .NET 4.0 you can replace it with System.Threading.Semaphore which allows you to acquire permits in one thread and release them in another.
The Semaphore class does not enforce thread identity on calls to WaitOne or Release.
Upvotes: 8