我有一个叫做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