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

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

ภาพรวม

อาร์เรย์ใน C# มีคุณสมบัติ SyncRoot (มาจาก ICollection) ใช้ร่วมกับ lock เพื่อให้การเข้าถึงอาร์เรย์เป็น thread-safe

ตัวอย่างที่ 1: อาร์เรย์จำนวนเต็ม

using System;

public class Demo
{
    public static void Main()
    {
        Array intArr = new int[] { 5, 10, 15, 20, 25, 30, 35, 40 };

        Console.WriteLine("Integer array...");
        foreach (int i in intArr)
            Console.WriteLine(i);

        Console.WriteLine("After applying lock on array...");
        lock (intArr.SyncRoot)
        {
            foreach (Object ob in intArr)
                Console.WriteLine(ob);
        }
    }
}

ผลลัพธ์

Integer array...
5
10
15
20
25
30
35
40
After applying lock on array...
5
10
15
20
25
30
35
40

ตัวอย่างที่ 2: อาร์เรย์สตริง

using System;

public class Demo
{
    public static void Main()
    {
        Array strArr = new String[] { "Harry", "Tom", "Kevin", "Ryan", "Katie", "Amy" };

        Console.WriteLine("String array...");
        foreach (string i in strArr)
            Console.WriteLine(i);

        Console.WriteLine("After applying lock on array...");
        lock (strArr.SyncRoot)
        {
            foreach (Object ob in strArr)
                Console.WriteLine(ob);
        }
    }
}

ผลลัพธ์

String array...
Harry
Tom
Kevin
Ryan
Katie
Amy
After applying lock on array...
Harry
Tom
Kevin
Ryan
Katie
Amy

สรุป

  • ทุกอาร์เรย์มี SyncRoot ใช้กับ lock ได้เลย
  • การล็อกเฉพาะช่วงที่อ่าน/เขียนจริง ไม่ควรล็อกนานเกินไป
  • สำหรับสถานการณ์ซับซ้อน ควรใช้ ConcurrentBag หรือ ConcurrentQueue แทน