从集合访问器更新数据库:引发私人事件

本文关键字:事件 数据库 集合 访问 更新 | 更新日期: 2023-09-27 18:36:25

当类属性更改时,我需要更新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在回答中说:

如果两个线程同时访问 [一个属性],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()的正确方法是什么?

从集合访问器更新数据库:引发私人事件

只需将IsAsync = True添加到您的Binding中,您的第一种方法就会起作用。