2013-11-02 23 views
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"); 
     } 
    } 
+8

這是一個非常糟糕的主意。你的API的任何消費者(這不是你自己)會非常驚訝地發現設置'Obj'使服務器調用將值寫入數據庫。 –

+0

@KirkWoll即使它裏面有一個Task? – FPGA

+2

這並不重要。關鍵是制定者不應該做那種重型工作。它應該與設置字段的價值一樣沒有影響力。如果你的代碼要通過網絡來訪問Web服務或數據庫,那麼應該通過一個正確命名的方法(如SaveChanges())來清楚說明。 –

回答

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); 
}); 
+2

假設班級的消費者不是添加監聽者的人,那麼您與直接在設置者中執行操作的本質上有相同的缺點。 –

+1

@KirkWoll偵聽器需要由使用該類的類添加,不一定是該類的最終用戶,但某些類更高 - 在使用setter的類中的層。 – dasblinkenlight

+1

夠公平的。 *我*永遠不會通過一個簡單的屬性設置器來更新數據庫,但我承認這是一個判斷呼叫。 –

相關問題