0

在没有锁定的情况下在属性设置器中启动任务有什么问题吗?

 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");
        }
    }
4

1 回答 1

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);
});
于 2013-11-02T02:27:27.547 回答