我需要在类属性更改时更新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()
的正确方法是什么?
答案 0 :(得分:0)
只需将IsAsync = True
添加到Binding
,您的第一种方法即可。