1

ここに、辞書の値を更新する方法の例を示すコードがあります。スレッドセーフかどうかわからないので、これが最善の方法だとは思いません。

編集: これは単なる POC コードです。キーを配列にコピーしてから、ディクショナリで処理を行うことを意味します。ここに雇用主のコードを投稿することはできないので、例を挙げて説明しました。

キーのコピーを配列に取得すると、コードの他の部分でディクショナリ参照を使用している可能性があり、いくつかのキーが追加される可能性があります。そのような関数は、ある時点でそれらをコピーしたため、すべてのキーを更新しません。サブクラス化するか、辞書をラップしてロックで操作する必要がありますか、それとももっと簡単な方法がありますか?

適切な方法で値を更新するにはどうすればよいですか?

    static void Main(string[] args)
    {
     Dictionary<string, int> dic = new Dictionary<string, int>();

     dic.Add("Kej1",0);
     dic.Add("Kej2",1);
     dic.Add("Kej3", 3);
     dic.Add("Kej4", 3);

     String[] arr = new string[dic.Count] ;
     dic.Keys.CopyTo(arr,0);

    foreach (var va in arr)
    {
        Console.WriteLine(dic[va] + " " + va);
        dic[va] = 10;
        Console.WriteLine(dic[va] + " " + va);
    }
    Console.ReadKey();
    }
4

3 に答える 3

3

.NET 4 以降のスレッド セーフ辞書が必要な場合は、ConcurrentDictionaryを使用できます。

于 2012-06-22T08:07:56.457 に答える
0

現在の実装はそのままで問題ありません。君の

 Dictionary<string, int> dic = new Dictionary<string, int>(); 

はローカル変数であり、メイン スレッドによってのみ参照されます。スレッドセーフについて心配する必要はありません。

本当にスレッドセーフにしたい場合は、次の方法で辞書をロックできます。

static void Main(string[] args) 
{ 
  Dictionary<string, int> dic = new Dictionary<string, int>(); 

  lock(dic)
  {
   dic.Add("Kej1",0); 
   dic.Add("Kej2",1); 
   dic.Add("Kej3", 3); 
   dic.Add("Kej4", 3); 

   String[] arr = new string[dic.Count] ; 
   dic.Keys.CopyTo(arr,0);

   foreach (var va in arr) 
   { 
     Console.WriteLine(dic[va] + " " + va); 
     dic[va] = 10; 
     Console.WriteLine(dic[va] + " " + va); 
   } 
  } 
  Console.ReadKey(); 
} 
于 2012-06-22T08:17:03.343 に答える
0

実際に複数のスレッドを使用する場合にのみ、スレッド セーフについて心配する必要があります。ほとんどの場合、無意識のうちにそれを行うことはできません。ですから、心配する必要はありません。好きな方法で辞書にアクセスしてください。

「async」または「Begin」という単語が含まれているものを使用する場合は、これを再検討する必要があるかもしれません。

于 2012-06-22T08:17:11.643 に答える