tec*_*eak 1 c# dataset thread-safety
我想对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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
从for循环调用此方法.
for(int x=0; x<40; x++;){
if(someCondition)
.
.
.
MyDataSet.UpdateRow(key,data);
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
一切都在多线程环境中完成.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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
您的_lock对象应该是程序中的静态对象,以使其成为一个很好的锁.你Find应该在锁定的部分.