Мне нужно обновить базу данных SQLite при изменении свойства класса. Вот плохая реализация, которая демонстрирует именно то, что должно быть достигнуто в большем масштабе:Обновление базы данных из набора accessor: Поднять личное событие?
internal class MyClass
{
private bool isFoo;
internal bool IsFoo
{
get { return isFoo; }
private set
{
isFoo = value;
UpdateDatabase(); // ← This method could take some time.
}
}
private void UpdateDatabase()
{
DatabaseClass.Update(this);
}
}
SO пользователь, LukeH, сказал в answer:
если доступ два потока [свойство] одновременно Поглотитель будет кратко блокировать вторую нить, пока она не возвращает объект в первый поток ...
Текущий Direc
Я не хочу блокировать доступ к собственности. Если я реализую INotifyPropertyChanged
, мой код будет либо несовместим с тем, как он сохраняет данные, либо превратит DatabaseClass
в беспорядок обработчиков. Вот подход, который я не хотел бы использовать:
public class MyClass
{
private bool isFoo;
internal bool IsFoo
{
get { return isFoo; }
private set
{
isFoo = value;
UpdateRequesting(); // Call delegate, similar to INotifyPropertyChanged
}
}
// Private event and delegate.
private delegate bool OnUpdateRequesting();
private event OnUpdateRequesting UpdateRequesting;
internal MyClass()
{
// Subscribe to private event inside of constructor.
UpdateRequesting += UpdateDatabase;
}
// Now, raised by event rather than called directly from set accessor.
private bool UpdateDatabase()
{
return DatabaseClass.Update(this);
}
}
Используя личные события чувствует, как я набрав свой собственный номер телефона. Каков правильный способ получить UpdateDatabase()
без функции блокировки?
Когда 'IsFoo' изменяется, вы создаете из него команду Sql в потоке пользовательского интерфейса, а затем можете выполнять в другом потоке. таким образом вы можете реализовать 'INotifyPropertyChanged' без проблем – Sakura
@Sakura: реализация' INotifyPropertyChanged' будет почти идентична приведенному выше коду. Просто замените 'OnUpdateRequesting' на' OnPropertyChanged'; однако для этого потребуются ненужные экземпляры 'MyClass' и' PropertyChangedEventArgs'. –
Как вы используете 'UpdateRequesting();'? Вы вызывали функцию для обновления пользовательского интерфейса или задали значение для элемента управления? – Sakura