我在Windows控制台应用程序中实现了线程安全数据集更新操作,如本问题的答案所示。
我想仔细检查我正在关注的更新数据集行的方法。
每个线程都有UpdateData实例方法。此方法创建一个主键字符串数组,以查找数据表中的特定行和要在该行中更新的数据字典。
private void UpdateData()
{
string[] key=new string(){"",""};
Dictionary<string,string> data=new Dictionary<string,string>();
key[0]="key1";
key[1]="key2";
data.Add("col1","value1");
data.Add("col2","value2");
MyDataSet.UpdateRecord(key,data);
}
现在有一个共享方法用于更新全局DataSet中的DataTable Row。
public sealed class MyDataSet
{
public static DataSet ds= new DataSet();
private static object _lock =new object();
public static UpdateRow(string[] key,Dictionary<string,string> data)
{
lock(_lock){
DataRow dr=ds.Tables[0].Rows.Find(key);
dr.AcceptChanges();
dr.BeginEdit();
foreach(KeyValuePair<string,string> field in data)
{
dr[field.key]=field.value;
}
dr.EndEdit();
}
}
}
所以我的问题是,这种将引用类型的引用键和数据传递给静态共享方法的方法是否会给线程安全带来任何问题?密钥和数据都不共享,每个线程都创建自己的副本。如果两个线程进入UpdateRow方法,是否可以通过一个线程传递的密钥和另一个线程的数据来更新行(我知道这些问题听起来很愚蠢)
答案 0 :(得分:2)
如果两个不同的线程调用UpdateRow方法,则会创建两个不同的堆栈,每个堆栈将保存对传入的参数的引用。因此,在每个执行的上下文中,您都可以保证所有参数都是一致的。 / p>
因此,不能用一个密钥和另一个堆栈中的数据进行更新。