在没有锁定的情况下在属性设置器中启动任务有什么问题吗?
private someObject obj;
public SomeObject Obj
get { return obj; }
set
{
if (value != obj)
{
Task.Factory.StartNew(() =>
{
UpdateToSql(value); //if object exists updates it other wise inserts it
});
obj = value;
OnPropertyChanged("Obj");
}
}
答案 0 :(得分:3)
在setter中明确地启动任务可能不是一个好主意,因为这是不寻常的。
更常用的方法是为它制作一个方法:API用户更习惯于启动任务的方法:
public void SetAndPersistObj(SomeObject value) {
if (value != obj)
{
Task.Factory.StartNew(() =>
{
UpdateToSql(value); //if object exists updates it other wise inserts it
});
obj = value;
OnPropertyChanged("Obj");
}
}
然而,即使这可能不是最理想的,因为它将持久性与对象实现结合得太多了。更好的方法是为已经触发的属性更改事件添加一个侦听器,并从那里启动任务:
ObjChanged += () => Task.Factory.StartNew(() => {
UpdateToSql(value);
});