0

我已经在这个问题的答案中给出的 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 方法,是否可以通过一个线程传递的键和另一个线程的数据以任何方式更新行(我知道这个问题听起来很愚蠢)

4

1 回答 1

2

如果 UpdateRow 方法由两个不同的线程调用,则会创建两个不同的堆栈,每个堆栈将保存对传入参数的引用。因此,在每个执行上下文中,您可以保证所有参数都是一致的。

因此,不,不可能使用来自一个堆栈的密钥和来自另一个堆栈的数据进行更新。

于 2012-05-29T14:53:16.647 回答