Я буду использовать что-то вроде:
using( var sl = new SoftLock() )
{
sl.Execute(()=>{....});
}
Выполнение вызовет внутреннее логическое значение для предотвращения повторного входа.В распоряжении этот флаг будет сброшен.Execute вызовет лямбду, только если флаг равен false.Это делается для того, чтобы флаг становился ложным, даже если происходит исключение (приводящее к тому, что обработчик не выполняется), и, возможно, его немного лучше увидеть.Конечно, это не потокобезопасно, как исходный код, но это потому, что мы говорим о предотвращении двойного выполнения из потока того же .