0Pricing
C# Academy · درس

ConcurrentDictionary<T> والمجموعات غير القابلة للتغيير

استخدم ConcurrentDictionary للتحديثات الآمنة للخيوط، وتعلّم أساليب بسيطة للتعامل مع المجموعات غير القابلة للتغيير: العروض للقراءة فقط والنسخ عند الكتابة.

ConcurrentDictionary<T> والمجموعات غير القابلة للتغيير درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 3 دروس في المجموع.

أساسيات أمان الخيوط وعدم القابلية للتغيير

موضوع اليوم:

  • ConcurrentDictionary<TKey,TValue>: تحديثات آمنة من خيوط متعددة
  • عروض للقراءة فقط مقابل عدم القابلية الحقيقية للتغيير
  • فكرة النسخ عند الكتابة لتحقيق أمان بسيط

العمليات الذرية: GetOrAdd/AddOrUpdate

استخدم GetOrAdd وAddOrUpdate للعمليات الذرية، وTryGetValue للقراءة بأمان.

using System;
using System.Collections.Concurrent;

public class Program
{
  public static void Main(string[] args)
  {
    ConcurrentDictionary<string, int> counts = new ConcurrentDictionary<string, int>();

    // Add if missing
    int a = counts.GetOrAdd("apple", 0); // 0
    // Increment safely
    int newVal = counts.AddOrUpdate("apple", 1, (key, oldValue) => oldValue + 1);

    Console.WriteLine("apple was " + a + ", now " + newVal);

    int value;
    bool ok = counts.TryGetValue("apple", out value);
    Console.WriteLine("Has apple? " + ok + " -> " + value);
  }
}

فكرة الزيادة الخالية من حالات الت race

يتجنّب AddOrUpdate حالة السباق التقليدية في عملية القراءة والتعديل والكتابة، وذلك عبر التحديث بشكل ذري.

using System;
using System.Collections.Concurrent;

public class Program
{
  static int Inc(int oldValue) { return oldValue + 1; }

  public static void Main(string[] args)
  {
    ConcurrentDictionary<string, int> clicks = new ConcurrentDictionary<string, int>();

    // Simulate multiple updates
    for (int i = 0; i < 5; i++)
    {
      clicks.AddOrUpdate("home", 1, delegate(string k, int v) { return Inc(v); });
    }

    Console.WriteLine("home clicks = " + clicks["home"]); // 5 (starting at 1 then +4)
  }
}

عرض للقراءة فقط (ليس غير قابل للتغيير)

يعيد AsReadOnly عرضاً للقراءة فقط، وليس مجموعة غير قابلة للتغيير فعلياً؛ إذ تظهر تغييرات المصدر في العرض.

using System;
using System.Collections.Generic;

public class Program
{
  public static void Main(string[] args)
  {
    List<string> items = new List<string>(new string[] { "A", "B" });
    var ro = items.AsReadOnly(); // ReadOnlyCollection<string>

    foreach (string s in ro) Console.WriteLine(s); // A, B

    // ro.Add("C"); // not available: read-only view has no Add

    // But changing the source list reflects in the view:
    items.Add("C");
    Console.WriteLine("After source change:");
    foreach (string s in ro) Console.WriteLine(s); // A, B, C
  }
}

لقطة النسخ عند الكتابة

النسخ عند الكتابة: أعد قائمة جديدة عند إجراء التغييرات. ويرى المستدعون الذين يحتفظون بالقائمة القديمة لقطة ثابتة.

using System;
using System.Collections.Generic;

public class Program
{
  static List<int> AddWithoutTouchingOriginal(List<int> original, int item)
  {
    // create a copy and modify the copy
    List<int> copy = new List<int>(original);
    copy.Add(item);
    return copy;
  }

  public static void Main(string[] args)
  {
    List<int> a = new List<int>(new int[] { 1, 2 });
    List<int> b = AddWithoutTouchingOriginal(a, 3);

    Console.WriteLine("Original:");
    foreach (int x in a) Console.WriteLine(x); // 1,2

    Console.WriteLine("Copy:");
    foreach (int x in b) Console.WriteLine(x); // 1,2,3
  }
}

نصائح والمفاضلات

نصائح:

  • استخدم ConcurrentDictionary للعدادات أو ذاكرات التخزين المؤقت المشتركة.
  • يمنع AsReadOnly التعديل غير المقصود من المستهلكين.
  • للحصول على عرض ثابت، انسخ القائمة قبل تعديلها.
  • توجد المجموعات غير القابلة للتغيير فعلياً في System.Collections.Immutable (حزمة)؛ ولا نستخدمها هنا للحفاظ على استقلالية الشيفرة.

اختيار قاموس آمن للخيوط

تحقق سريع: أي مجموعة تدعم الإضافات والتحديثات الآمنة للخيوط من دون أقفال خارجية؟

مراجعة

مراجعة: استخدم ConcurrentDictionary للتحديثات المتزامنة. اعرض عروضاً للقراءة فقط للمستدعين، واستخدم النسخ عند الكتابة عندما تحتاج إلى لقطات ثابتة.

الأسئلة الشائعة

هل درس «ConcurrentDictionary<T> والمجموعات غير القابلة للتغيير» مجاني؟

نعم — نص درس «ConcurrentDictionary<T> والمجموعات غير القابلة للتغيير» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 3 دروس في المجموع.

ماذا ستتعلم في «ConcurrentDictionary<T> والمجموعات غير القابلة للتغيير»؟

استخدم ConcurrentDictionary للتحديثات الآمنة للخيوط، وتعلّم أساليب بسيطة للتعامل مع المجموعات غير القابلة للتغيير: العروض للقراءة فقط والنسخ عند الكتابة. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.

كم من الوقت يستغرق درس «ConcurrentDictionary<T> والمجموعات غير القابلة للتغيير»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. HashSet وSortedSet وQueue وStack
  2. ConcurrentDictionary والمجموعات غير القابلة للتغيير
  3. المساواة والتجزئة (القيمة مقابل المرجع)
← العودة إلى C# Academy