【问题标题】:Proper way of using Dictionary正确使用字典的方法
【发布时间】:2012-06-22 08:04:39
【问题描述】:

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

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

当我将 Keys 复制到数组时,我可能会在代码的其他部分中使用 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();
    }

【问题讨论】:

  • 不知道这个例子应该展示什么。您提到了多个线程,但该示例没有。试着改写你的问题。
  • 这看起来像一个控制台应用程序。您的代码中没有多个线程。
  • @Jon 我已经更新了描述,这只是 POC 代码,有些想象力会被欣赏,我不能在这里发布“不是我的代码”。

标签: c# dictionary


【解决方案1】:

如果您想要从 .NET 4 开始的线程安全字典,您可以使用 ConcurrentDictionary

【讨论】:

  • 是的,你可以,但这有一些 unexpected 行为(例如,添加可能不会成功)你已经习惯了 - 在大多数情况下,带有lock(dict) { ... } 的普通字典会工作就好了
  • 它是否允许我更新字典的值,就像上面的示例一样,由于枚举中断,我无法在不将键复制到数组的情况下更新值?我会用并发字典测试一些。
【解决方案2】:

您当前的实现很好。你的

 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(); 
} 

【讨论】:

  • 这是我的第一个想法,但我想以最好的方式做到这一点,现在看起来确实如此。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    相关资源
    最近更新 更多