Concerning IsDisabled question, I saw the while loop below take !IsDisabled into account.  However, the while loop taking lock does not.  So it seems strange.   If you said that the act of disabling would somehow free the lock indirectly - then it is fine.  THough, it does not heard to check IsDisabled in loop waiting for lock.

Concerning while infinite loop taking lock, I thought we have a bigger loop to ensure continuous job is running at all time.  If so, we could simply return if can't take lock and let the upper taking care of retry.