1

在这里,我有一段代码,展示了我想如何更新字典中的值的示例。我不认为这是最好的方法,因为我不确定它是线程安全的。

编辑:这只是 POC 代码,我的意思是将 Keys 复制到数组,然后在 Dictionary 上做一些事情。伙计们,我不能在这里发布我雇主的代码,所以我举了一个例子来说明问题。

当我获得 Keys to array 的副本时,我可能会在代码的其他部分中使用 Dictionary 引用,其中可能会添加一些键,然后此类函数不会更新所有键,因为我在某个时间点复制了这些键。我应该继承或包装字典并用锁对其进行操作,还是有更简单的方法?

我应该如何以正确的方式更新值?

    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

如果您实际使用多个线程,您只需要担心线程安全。大多数时候你不能在不知不觉中做到这一点。所以不要担心它并以任何你想要的方式访问你的字典。

如果您使用任何包含“异步”或“开始”一词的内容,您可能需要重新考虑这一点。

于 2012-06-22T08:17:11.643 回答