我有一個叫做DataStorage的單例obj,它在我的應用程序中存儲公共數據;其中一個是名爲myTable的Datatable,它將被多個線程讀取和寫入。我有一個私人物件,用來作爲數據存儲鎖即C#:datatable線程安全問題
private object lockObj = new object();
我已經纏訪問myTable的這樣鎖:
private DataTable myTable;
public DataTable MyTable
{
get
{ lock(lockObj) { return myTable; } }
set
{ lock(lockObj) { myTable = value; } }
}
另一個目的,即MyObj中會得到這樣的數據表,做一個選擇然後在Select中修改檢索到的DataRow []中的某個值。我已閱讀,選擇是不是線程安全的,所以我寫了我這樣的代碼:
// lock on MyTable
DataTable dt = DataStorage.Instance.MyTable;
lock (MyObjLockObj) // lock object for MyObj class
{
// do a select, then modify value in the returned row
DataRow[] foundRows = dt.Select("some expression");
foundRows[0]["some col"] = 123456;
}
問題: 1.總體而言,這是代碼線程安全的?
當我在MyObj中修改檢索的DataRow時,MyTable設置程序是否確保其線程安全?因爲setter用於設置DataTable,而不是DataRow。
我是否應該將訪問DataStorage.Instance.MyTable的代碼移動到與Select?相同的鎖定塊中?
在此先感謝。
感謝您的洞察力,我已將將數據表中的值更改回單身對象的責任。 – cks2k2 2011-05-16 10:42:00