从set访问器更新数据库:引发私有事件?

时间:2016-02-27 09:14:40

标签: c# wpf database multithreading accessor

我需要在类属性更改时更新SQLite数据库。这是一个糟糕的实现,它准确地说明了需要在更大范围内完成的工作:

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中说:

  

如果两个线程同时访问[属性],则getter将   暂时阻止第二个线程,直到它将对象返回到   第一线...

当前方向

我不想阻止访问该物业。如果我实现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()的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

只需将IsAsync = True添加到Binding,您的第一种方法即可。