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 行を更新するために使用されるこの共有メソッドがあります。

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 つのスレッドから渡されたキーと別のスレッドのデータを使用して行を更新することはどうしても可能でしょうか (この質問はばかげているように聞こえます)。

4

1 に答える 1

2

UpdateRow メソッドが 2 つの異なるスレッドによって呼び出される場合、2 つの異なるスタックが作成され、各スタックは渡されたパラメーターへの参照を保持します。したがって、実行中の各コンテキストで、すべてのパラメーターが一貫していることが保証されます。

したがって、あるスタックのキーと別のスタックのデータで更新することはできません。

于 2012-05-29T14:53:16.647 に答える