lock(this)
лучше избегать - существует крайний случай, когда какой-то другой не связанный код может также заблокировать его, что может даже вызвать тупик.
Лучший подход:
private readonly object lockObj = new object();
А потом lock(lockObj)
- поскольку это личное, вы избегаете этого крайнего случая.
Другая стратегия заключается в загрузке всех данных в неизменяемый инкапсулированный объект; тогда вы можете поменять все, обновив одну ссылку; и эталонное присвоение гарантированно будет атомарным. Это позволяет:
private SomeModel model;
public void Refresh() {
SomeModel newModel = new ...
// fully load etc
...
model = newModel;
}
Это лучше всего работает, если вы всегда делаете снимок, т.е. вместо
var foo = model.Foo;
var bar = model.Bar;
Вы используете:
var snapshot = model;
var foo = snapshot.Foo;
var bar = snapshot.Bar;
Теперь мы знаем, что Foo и Bar принадлежат к одной модели.