2016-02-27 5 views
0

Мне нужно обновить базу данных 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() без функции блокировки?

+0

Когда 'IsFoo' изменяется, вы создаете из него команду Sql в потоке пользовательского интерфейса, а затем можете выполнять в другом потоке. таким образом вы можете реализовать 'INotifyPropertyChanged' без проблем – Sakura

+0

@Sakura: реализация' INotifyPropertyChanged' будет почти идентична приведенному выше коду. Просто замените 'OnUpdateRequesting' на' OnPropertyChanged'; однако для этого потребуются ненужные экземпляры 'MyClass' и' PropertyChangedEventArgs'. –

+0

Как вы используете 'UpdateRequesting();'? Вы вызывали функцию для обновления пользовательского интерфейса или задали значение для элемента управления? – Sakura

ответ

0

Просто добавьте IsAsync = True в ваш Binding, и ваш первый подход будет работать.

 Смежные вопросы

  • Нет связанных вопросов^_^