我想让 DataTable/DataSet 的更新操作成为线程安全的。有大约 20 个线程,每个线程使用以下命令更新大约 40 行全局 DataTableRows.Find(pk)
数据表的方法。每个线程将更新 DataTable 的不同行。
我正在使用以下数据集包装类。这种方法是线程安全的吗?
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
loop.
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();
}
}
}
Your _lock
对象应该是程序中的静态对象,以使其成为良好的锁。和你的Find
应该在锁定部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)