У меня есть класс с несколькими свойствами. При каждом обновлении значения вызывается метод Store
, который хранит все поля (в файле).Является ли этот код потокобезопасным?
private int _Prop1;
public int Prop1 {
get {
return _Prop1;
}
set {
_Prop1 = value;
Store();
}
}
// more similar properties here...
private XmlSerializer _Ser = new ...;
private void Store()
{
lock (_Ser) {
using (FileStream fs = new ...) {
_Ser.Serialize (fs, this);
}
}
}
Этот дизайн нить-сейф?
(Кстати, если вы можете думать о более соответствующей подписи, не стесняйтесь редактировать).
Я думаю, что это поточно. Если свойства изменены в нескольких потоках, значения будут установлены в случайном порядке, атомные магазины будут происходить в случайном порядке, но в конце каждое свойство будет иметь последнее значение, и в самом конце происходит атомный магазин, чтобы файл был обновлен.
Уточнение: Свойства не будут устанавливаться очень часто, но они могут быть установлены одновременно. Важно иметь действительный файл большую часть времени.
Если поток изменит свойство относительно значения свойства, он должен заблокировать весь объект для синхронизации с другими потоками. Это в основном то же самое, что и при блокировке на List
при перечислении и не несет ответственности за этот класс.
Сохранение изменений на диске после каждой модификации свойств звучит ужасно неэффективно. Что делать, если кто-то хочет сразу изменить 20 свойств? –
Это внутренний компонент, поэтому я знаю, что он не будет изменяться очень часто. – mafu
«в конце концов, каждое свойство будет иметь свое последнее значение»; возможно ли что-нибудь прочитать файл между этими магазинами, оставив значение чтения в неопределенном состоянии (например, два свойства, имеющие несовместимые значения)? То же самое может произойти, если по какой-то причине один из магазинов не работает. –