我想对 DataTable/DataSet 进行线程安全的更新操作。有大约 20 个线程,每个线程使用 DataTable 的 Rows.Find(pk)
方法更新大约 40 行全局 DataTable。每个线程将更新 DataTable 的不同行。
我正在为 DataSet 使用以下包装器类。这种方法是线程安全的吗?
public sealed class MyDataSet{
public static DataSet ds = new DataSet();
public static UpdateRow(key,data)
{
object _lock = new object();
DataRow dr = ds.Tables[0].Rows.Find(key);
lock(_lock){
dr.AcceptChanges();
dr.BeginEdit();
dr["col"] = data;
dr.EndEdit();
}
}
}
此方法从 for
循环中调用。
for(int x=0; x<40; x++;){
if(someCondition)
.
.
.
MyDataSet.UpdateRow(key,data);
.
.
.
}
一切都在多线程环境中完成。 UpdateRow 方法线程安全吗?
不,这不安全。你应该改变你的代码:
public sealed class MyDataSet{
public static DataSet ds = new DataSet();
private static object _lock = new object();
public static UpdateRow(key,data)
{
lock(_lock){
DataRow dr = ds.Tables[0].Rows.Find(key);
dr.AcceptChanges();
dr.BeginEdit();
dr["col"] = data;
dr.EndEdit();
}
}
}
您的_lock
对象在您的程序中应该是一个静态对象,以使其成为一把好锁。而你的Find
应该在锁定的部分。
我是一名优秀的程序员,十分优秀!