この質問の回答にあるように、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 行を更新するために使用されるこの共有メソッドがあります。
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();
}
}
}
だから私の質問は、参照型のキーとデータを静的共有メソッドに渡すこのアプローチがスレッドセーフに問題を課すかどうかです? キーとデータの両方が共有されず、各スレッドが独自のコピーを作成します。2 つのスレッドが UpdateRow メソッドに入った場合、1 つのスレッドから渡されたキーと別のスレッドのデータを使用して行を更新することはどうしても可能でしょうか (この質問はばかげているように聞こえます)。