Я сталкивался с этим в своих интернет-путешествиях и знаю, что это очень старый вопрос, но я подумал, что предложу альтернативный ответ на него.
Можно заблокировать лямбду с помощью функции-обертки, которая допускает относительно элегантный синтаксис.
Вот вспомогательная функция (в статическом классе):
public static class Locking
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[DebuggerNonUserCode, DebuggerStepThrough]
public static T WithLock<T>(this object threadSync, Func<T> selector)
{
lock (threadSync)
{
return selector();
}
}
}
А вот как вы его используете:
private readonly object _threadSync = new object();
private int _myProperty;
public int MyProperty
=> _threadSync.WithLock(() => _myProperty);