从集合访问器更新数据库:引发私人事件
本文关键字:事件 数据库 集合 访问 更新 | 更新日期: 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
中,您的第一种方法就会起作用。