How to test if a thread is holding a lock on an object in C#?
Is there a way to test if the current thread is holding a monitor lock on an object? I.e. an equivalent to the Threa开发者_Go百科d.holdsLock in Java.
Thanks,
I don't believe there is. There are grotty hack things you could do like calling Monitor.Wait(monitor, 0)
and catching the SynchronizationLockException
, but that's pretty horrible (and could theoretically "catch" a pulse that another thread was waiting for).
I suggest you try to redesign so that you don't need this, I'm afraid.
EDIT: In .NET 4.5, this is available with Monitor.IsEntered
.
The relevant information is stored by the SyncBlock structure used by the CLR and can be viewed during debugging with e.g. WinDbg + sos. To my knowledge there is no way to obtain the information from managed code, but it may be possible from unsafe code assuming you can somehow (and in a reliable manner) obtain a pointer to the relevant data used by the CLR.
精彩评论