簡體   English   中英

使用Dictionary的正確方法

[英]Proper way of using Dictionary

這里我有一段代碼,顯示了我想如何更新字典中的值的示例。 我不認為這是最好的方法,因為我不確定它是否是線程安全的。

編輯:它只是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();
    }

如果您想從.NET 4開始使用Thread Safe字典,則可以使用ConcurrentDictionary

您當前的實現很好。 你的

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

如果實際使用多個線程,則只需要擔心線程安全。 大多數時候你不能在不知不覺中做到這一點。 所以,不要擔心它,並以任何你想要的方式訪問你的字典。

如果您使用其中包含“async”或“Begin”一詞的任何內容,您可能需要重新考慮這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM