У меня есть одноэлементный объект под названием DataStorage, который хранит общие данные в моем приложении;одним из них является Datatable, называемый myTable, который будет читаться и записываться несколькими потоками.У меня есть закрытый объект, который будет использоваться в качестве блокировки в DataStorage, т. Е.
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 [] из Select.Я читал, что Select не является потокобезопасным, поэтому я написал свой код следующим образом:
// 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. В целом, является ли этот код потокобезопасным?
Когда я изменяю извлеченный DataRow в MyObj, обеспечивает ли установщик MyTable его безопасность потока?Поскольку установщик предназначен для установки DataTable, а не DataRow.
Должен ли я переместить код, обращающийся к DataStorage.Instance.MyTable, в тот же блок блокировки, что и Select?
Заранее спасибо.