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

คุณสมบัติ Array.SyncRoot ใน C#

คุณสมบัติ Array.SyncRoot ใน C#

Array.SyncRoot คืนค่าอ็อบเจกต์ที่ใช้สำหรับซิงโครไนซ์การเข้าถึงอาร์เรย์ (Synchronization) ใช้ร่วมกับคำสั่ง lock เพื่อป้องกัน Race Condition เมื่อหลายเธรดเข้าถึงอาร์เรย์พร้อมกัน

ตัวอย่างการใช้งาน

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        Array arr = new int[] { 23, 11, 32, 18, 87 };

        // Lock ผ่าน SyncRoot ก่อนวนลูป
        lock (arr.SyncRoot)
        {
            foreach (object val in arr)
                Console.WriteLine(val);
        }
    }
}

ผลลัพธ์

23
11
32
18
87

รายละเอียดสำคัญ

  • SyncRoot เป็นการ Implement ของ Interface ICollection
  • การ Enumerate (foreach) บนคอลเลกชัน ไม่ใช่ Thread-safe แม้คอลเลกชันจะ Synchronized แล้ว
  • ต้องใช้ lock(arr.SyncRoot) ครอบการ Enumerate ทุกครั้ง
  • ใน .NET Core / .NET 5+ แนะนำให้ใช้ Immutable Collections หรือ Concurrent Collections (System.Collections.Concurrent) แทน

โค้ดแบบเต็มรูปแบบ

lock (arr.SyncRoot)
{
    foreach (var item in arr)
    {
        // Process item safely
    }
}