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

セッター内で明示的にタスクを開始することは、通常とは異なるため、お勧めできません。

より一般的なアプローチは、そのためのメソッドを作成することです。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 に答える