[英]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.