ภาพรวม
StringCollection มี SyncRoot ใช้กับ lock เพื่อให้การเข้าถึงเป็น thread-safe
ตัวอย่างที่ 1: เพิ่มจากอาร์เรย์ ลบ แล้วล็อก SyncRoot
using System;
using System.Collections.Specialized;
public class Demo
{
public static void Main()
{
StringCollection stringCol = new StringCollection();
String[] arr = new String[] { "100", "200", "300", "400", "500" };
Console.WriteLine("Array elements...");
foreach (string res in arr)
{
Console.WriteLine(res);
}
stringCol.AddRange(arr);
Console.WriteLine("Total number of elements = " + stringCol.Count);
stringCol.RemoveAt(3);
Console.WriteLine("Total number of elements now = " + stringCol.Count);
Console.WriteLine("Synchronize access...");
lock (stringCol.SyncRoot)
{
foreach (object ob in stringCol)
{
Console.WriteLine(ob);
}
}
}
}
ผลลัพธ์
Array elements... 100 200 300 400 500 Total number of elements = 5 Total number of elements now = 4 Synchronize access... 100 200 300 500
ตัวอย่างที่ 2: เพิ่มสตริงตรงๆ แล้วล็อก
using System;
using System.Collections.Specialized;
public class Demo
{
public static void Main()
{
StringCollection strCol = new StringCollection();
strCol.Add("Katie");
strCol.Add("Philips");
strCol.Add("Jacob");
strCol.Add("Carl");
strCol.Add("Gary");
Console.WriteLine("Synchronize access...");
lock (strCol.SyncRoot)
{
foreach (object ob in strCol)
{
Console.WriteLine(ob);
}
}
}
}
ผลลัพธ์
Synchronize access... Katie Philips Jacob Carl Gary
สรุป
- ใช้
lock(strCol.SyncRoot)ครอบการเข้าถึง - StringCollection เป็น legacy ควรใช้
List<string>ร่วมกับล็อกเองหรือConcurrentBag<string>