ภาพรวม
StringDictionary มี SyncRoot ใช้กับ lock เพื่อให้การเข้าถึงเป็น thread-safe
ตัวอย่างที่ 1: เพิ่มข้อมูล แล้วล็อก SyncRoot วนลูป
using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo
{
public static void Main()
{
StringDictionary strDict = new StringDictionary();
strDict.Add("A", "Books");
strDict.Add("B", "Electronics");
strDict.Add("C", "Appliances");
strDict.Add("D", "Pet Supplies");
strDict.Add("E", "Clothing");
strDict.Add("F", "Footwear");
Console.WriteLine("StringDictionary key-value pairs...");
foreach (DictionaryEntry de in strDict)
{
Console.WriteLine(de.Key + " " + de.Value);
}
Console.WriteLine("Value associated with key D = " + strDict["D"]);
Console.WriteLine("Value associated with key F = " + strDict["F"]);
Console.WriteLine("\nSynchronize access..");
lock (strDict.SyncRoot)
{
foreach (DictionaryEntry de in strDict)
{
Console.WriteLine(de.Key + " " + de.Value);
}
}
}
}
ผลลัพธ์
StringDictionary key-value pairs... a Books b Electronics c Appliances d Pet Supplies e Clothing f Footwear Value associated with key D = Pet Supplies Value associated with key F = Footwear Synchronize access.. a Books b Electronics c Appliances d Pet Supplies e Clothing f Footwear
ตัวอย่างที่ 2: StringDictionary อื่น พร้อมล็อก
using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo
{
public static void Main()
{
StringDictionary strDict = new StringDictionary();
strDict.Add("A", "John");
strDict.Add("B", "Andy");
strDict.Add("C", "Tim");
strDict.Add("D", "Ryan");
strDict.Add("E", "Kevin");
strDict.Add("F", "Katie");
strDict.Add("G", "Brad");
Console.WriteLine("StringDictionary elements...");
foreach (DictionaryEntry de in strDict)
{
Console.WriteLine(de.Key + " " + de.Value);
}
Console.WriteLine("\nSynchronize access..");
lock (strDict.SyncRoot)
{
foreach (DictionaryEntry de in strDict)
{
Console.WriteLine(de.Key + " " + de.Value);
}
}
}
}
ผลลัพธ์
StringDictionary elements... a John b Andy c Tim d Ryan e Kevin f Katie g Brad Synchronize access.. a John b Andy c Tim d Ryan e Kevin f Katie g Brad
สรุป
- ใช้
lock(strDict.SyncRoot)ครอบการวนลูปหรือการอ่าน/เขียน - StringDictionary ไม่ได้ thread-safe เอง
- ใหม่ควรใช้
ConcurrentDictionary<string, string>แทน