Вы не можете сделать объектный поток безопасным, просто окружив отдельные методы блокировками. Все, что вы в итоге делаете, это сериализуете (замедляет) доступ к объекту.
Рассмотрим этот второстепенный пример:
var myObject = ...
var myThreadSafeList = ...
if (!myThreadSafeList.Contains(myObject))
{
myThreadSafeList.Add(myObject);
}
Даже если в myThreadSafeList заблокированы все методы, это не является потокобезопасным, поскольку другой поток может изменять содержимое списка между вызовами Contains()
и Add()
.
В случае этого списка требуется дополнительный метод: AddIfMissing()
:
var myObject = ...
var myThreadSafeList = ...
myThreadSafeList.AddIfMissing(myObject);
Только перемещая логику в объект, вы можете окружить обе операции замком и сделать его безопасным.
Без дальнейших подробностей, комментировать дальше сложно, но я бы предложил следующее:
- Сделайте все свойства доступными только для чтения и разрешите кому угодно читать их в любое время
- Предоставляют методы-мутаторы, которые принимают наборы свойств, которые модифицируются вместе, и вносят изменения атомарно в пределах блокировки
Для иллюстрации:
public class Person {
public string FullName { get; private set; }
public string FamilyName { get; private set; }
public string KnownAs { get; private set; }
public void SetNames( string full, string family, string known) {
lock (padLock) {
...
}
}
}