Избавился от диспетчера, теперь каждое свойство просто подписывается на события изменения. На самом деле, это довольно плох, ведь при каждом чтении каждого свойства вызываются все события, и каждое из них проверяет индекс. Но пока так.
Сильно прибрался в StoredValue
Изменил систему PropertyValueViewModel: разделяю модели сравнения свойств "текущее-заданное" и сравнения свойств для полукомплектов. Пока что добавил только различные модели для различных состояний синхронизации полукомплектов
Убрал ошибку с неправильным определением типа ошибки хранящегося значения для модели значения свойства.
Наньше тип ошибки для значения свойства транслировался напрямую из типа ошибки для ячейки. Поэтому, если в одной ячейке хранилось несколько свойств, а ошибка была только в одном из них, эта же ошибка (в данном случае, рассинхронизация по полукомплектам) транслировалось в каждое свойство, хранящееся в этой ячейке. Теперь тип ошибки вычисляется при создании объекта значения свойства.
Теперь StorageOperator читает свойства через StorageListener, что должно уменьшить количество проблем и недопониманий при многопоточных попытках доступа к чтению/записи свойств МПХ.
Запись свойств по прежнему работает через жо?у.
Запись свойств тоже переведена на использование StorageListener
Перезапрос при неудачном чтении или записи (в модели StorageListener)
Merge branch 'refactories/storage-listener' into refactories/value-models
Исправил ошибки адаптации к новой модели StoredValue
Почистил StorageOperator от неиспользуемого. Добавил комментариев.
Сделал в интерфейсе IStorageRequestToken свойства RecordA и RecordB не Nullable<>. Дефолтные значения (ReadError) им задаю внутри класса.
Подправил обработку ошибок чтения/записи. В частности, то, что касается кода ошибки Busy.
Дело в том, что ошибка Busy автоматически означает необходимость перезапроса свойства. И означает, что ответ уже больше не дойдёт. А раньше я считал, что после отправки Busy-сообщения, МПХ всё таки вышлет свой ответ.
Добавлен секундомер, заставляющий StorageOperator выжидать таймаут перед переотправкой запроса.
В StorageOperator вынесен параметр RetriesCout, определяющий количество повторов при неудачной попытке считать или записать свойство
Merge branch 'refactories/storage-listener' into refactories/value-models

Conflicts:
	LocoBase/Storing/StorageOperator.cs
Вынес значение значения в отдельную модель, она теперь производит всё, что касается словаря значений и всего такого