Is there anything wrong with the following as a short solution?
private object myLock = new object(); if (Monitor.TryEnter(myLock)) { doWork(); Monitor.Exit(myLock); } else { lock (myLock){ }; }