Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

การเข้าถึง StringCollection แบบซิงโครไนซ์ใน C#

ภาพรวม

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>