C# 使用带有引用类型参数的方法更新线程安全全局数据集

C# 使用带有引用类型参数的方法更新线程安全全局数据集,c#,multithreading,static,dataset,C#,Multithreading,Static,Dataset,我已经在windows控制台应用程序中实现了threadsafe数据集更新操作,如问题的答案所示 我想再次检查更新数据集行所采用的方法 每个线程都有UpdateData实例方法。此方法创建主键的字符串数组,以查找datatable中的特定行以及该行中要更新的数据字典 private void UpdateData() { string[] key=new string(){"",""}; Dictionary<string,string> data=new Dictionary&

我已经在windows控制台应用程序中实现了threadsafe数据集更新操作,如问题的答案所示

我想再次检查更新数据集行所采用的方法

每个线程都有UpdateData实例方法。此方法创建主键的字符串数组,以查找datatable中的特定行以及该行中要更新的数据字典

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);
}
private void UpdateData()
{
字符串[]键=新字符串(){“”“”};
字典数据=新字典();
键[0]=“键1”;
键[1]=“键2”;
添加数据(“col1”、“value1”);
添加数据(“col2”、“value2”);
MyDataSet.UpdateRecord(键,数据);
}
现在有了这个共享方法来更新全局数据集中的DataTable行

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();
  }
}
}
公共密封类MyDataSet
{
公共静态数据集ds=新数据集();
私有静态对象_lock=新对象();
公共静态UpdateRow(字符串[]键,字典数据)
{
锁{
DataRow dr=ds.Tables[0]。Rows.Find(键);
dr.AcceptChanges();
BeginEdit博士();
foreach(数据中的KeyValuePair字段)
{
dr[field.key]=field.value;
}
EndEdit博士();
}
}
}

所以我的问题是,这种将引用类型的密钥和数据传递给静态共享方法的方法是否会给线程安全带来任何问题?密钥和数据都不共享,每个线程创建自己的副本。如果两个线程进入UpdateRow方法,是否可以通过任何方式使用一个线程传递的键和另一个线程的数据来更新行(我知道这个问题听起来很愚蠢)

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

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