I suppose I don't understand... if it should only be called by one thread at a time, why are multiple threads calling it to begin with?
Anyway, you can use Monitor.TryEnter(). It doesn't block and returns false
if it fails to acquire a lock. In that case you can just return from the function.