在属性设置器中启动任务

时间:2013-11-02 02:15:29

标签: c#

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

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

1 个答案:

答案 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);
});
相关问题