কম্পিউটার টিউটোরিয়াল

C#-তে ListDictionary সিঙ্ক্রোনাইজড (Thread-Safe) কিনা যাচাই করা

ListDictionary ক্লাসের IsSynchronized প্রোপার্টি ব্যবহার করে ডিকশনারি থ্রেড-সেফ (সিঙ্ক্রোনাইজড) কিনা তা জানা যায়। এই প্রোপার্টি সবসময় false রিটার্ন করে কারণ ListDictionary ডিফল্টভাবে থ্রেড-সেফ নয়।

উদাহরণ ১: ListDictionary-র সিঙ্ক্রোনাইজেশন ও অন্যান্য প্রোপার্টি যাচাই

using System;
using System.Collections;
using System.Collections.Specialized;

public class Demo {
    public static void Main() {
        ListDictionary dict = new ListDictionary();
        dict.Add("1", "SUV");
        dict.Add("2", "সেডান");
        dict.Add("3", "ইউটিলিটি ভেহিকেল");
        dict.Add("4", "কম্প্যাক্ট কার");
        dict.Add("5", "SUV");
        dict.Add("6", "সেডান");
        dict.Add("7", "ইউটিলিটি ভেহিকেল");
        dict.Add("8", "কম্প্যাক্ট কার");
        dict.Add("9", "ক্রসওভার");
        dict.Add("10", "ইলেকট্রিক কার");

        Console.WriteLine("ListDictionary উপাদানসমূহ...");
        foreach (DictionaryEntry d in dict) {
            Console.WriteLine(d.Key + " " + d.Value);
        }

        Console.WriteLine("\nনির্দিষ্ট আকার কিনা? = " + dict.IsFixedSize);
        Console.WriteLine("শুধুমাত্র পঠনযোগ্য কিনা? = " + dict.IsReadOnly);
        Console.WriteLine("সিঙ্ক্রোনাইজড (থ্রেড-সেফ) কিনা? = " + dict.IsSynchronized);
        Console.WriteLine("কী 'K' আছে কিনা? = " + dict.Contains("K"));
        Console.WriteLine("কী '9' আছে কিনা? = " + dict.Contains("9"));
    }
}

আউটপুট

ListDictionary উপাদানসমূহ...
1 SUV
2 সেডান
3 ইউটিলিটি ভেহিকেল
4 কম্প্যাক্ট কার
5 SUV
6 সেডান
7 ইউটিলিটি ভেহিকেল
8 কম্প্যাক্ট কার
9 ক্রসওভার
10 ইলেকট্রিক কার

নির্দিষ্ট আকার কিনা? = False
শুধুমাত্র পঠনযোগ্য কিনা? = False
সিঙ্ক্রোনাইজড (থ্রেড-সেফ) কিনা? = False
কী 'K' আছে কিনা? = False
কী '9' আছে কিনা? = True

উদাহরণ ২: দুটি ListDictionary এবং সিঙ্ক্রোনাইজেশন চেক

using System;
using System.Collections;
using System.Collections.Specialized;

public class Demo {
    public static void Main() {
        ListDictionary dict1 = new ListDictionary();
        dict1.Add("A", "বই");
        dict1.Add("B", "ইলেকট্রনিক্স");
        dict1.Add("C", "স্মার্ট ওয়েয়ারেবল");
        dict1.Add("D", "পেট সাপ্লাই");
        dict1.Add("E", "পোশাক");
        dict1.Add("F", "ফুটওয়েয়ার");

        Console.WriteLine("ListDictionary1 উপাদানসমূহ...");
        foreach (DictionaryEntry d in dict1) {
            Console.WriteLine(d.Key + " " + d.Value);
        }

        ListDictionary dict2 = new ListDictionary();
        dict2.Add("1", "এক");
        dict2.Add("2", "দুই");
        dict2.Add("3", "তিন");
        dict2.Add("4", "চার");
        dict2.Add("5", "পাঁচ");
        dict2.Add("6", "ছয়");

        Console.WriteLine("\nListDictionary2 কী-ভ্যালু জোড়া...");
        IDictionaryEnumerator demoEnum = dict2.GetEnumerator();
        while (demoEnum.MoveNext()) {
            Console.WriteLine("Key = " + demoEnum.Key + ", Value = " + demoEnum.Value);
        }

        Console.WriteLine("নির্দিষ্ট আকার কিনা? = " + dict2.IsFixedSize);
        Console.WriteLine("শুধুমাত্র পঠনযোগ্য কিনা? = " + dict2.IsReadOnly);
        Console.WriteLine("সিঙ্ক্রোনাইজড (থ্রেড-সেফ) কিনা? = " + dict2.IsSynchronized);
        Console.WriteLine("কী '5' আছে কিনা? = " + dict2.Contains("5"));
    }
}

আউটপুট

ListDictionary1 উপাদানসমূহ...
A বই
B ইলেকট্রনিক্স
C স্মার্ট ওয়েয়ারেবল
D পেট সাপ্লাই
E পোশাক
F ফুটওয়েয়ার

ListDictionary2 কী-ভ্যালু জোড়া...
Key = 1, Value = এক
Key = 2, Value = দুই
Key = 3, Value = তিন
Key = 4, Value = চার
Key = 5, Value = পাঁচ
Key = 6, Value = ছয়
নির্দিষ্ট আকার কিনা? = False
শুধুমাত্র পঠনযোগ্য কিনা? = False
সিঙ্ক্রোনাইজড (থ্রেড-সেফ) কিনা? = False
কী '5' আছে কিনা? = True

ListDictionary-র তিনটি মূল প্রোপার্টি

প্রোপার্টিরিটার্ন ভ্যালুঅর্থ
IsFixedSizefalseআকার পরিবর্তন করা যায় (Add/Remove/Clear)
IsReadOnlyfalseলিখা/পড়া উভয় সম্ভব
IsSynchronizedfalseথ্রেড-সেফ নয় (এক্সটার্নাল লক দরকার)

থ্রেড-সেফ्टी নিশ্চিত করার পদ্ধতি

// পদ্ধতি ১: lock স্টেটমেন্ট ব্যবহার (সুপারিশকৃত)
private readonly object _lock = new object();
private ListDictionary _dict = new ListDictionary();

public void SafeAdd(string key, object value) {
    lock (_lock) {
        _dict.Add(key, value);
    }
}

public bool SafeContains(string key) {
    lock (_lock) {
        return _dict.Contains(key);
    }
}

// পদ্ধতি ২: Synchronized wrapper (লিগ্যাসি, নন-জেনেরিক)
Hashtable syncDict = Hashtable.Synchronized(new Hashtable());
// ListDictionary-র জন্য সরাসরি Synchronized মেথড নেই

// পদ্ধতি ৩: আধুনিক - ConcurrentDictionary (সুপারিশকৃত)
using System.Collections.Concurrent;
var concurrentDict = new ConcurrentDictionary<string, string>();
concurrentDict.TryAdd("key", "value");  // থ্রেড-সেফ

সুপারিশ

  • ListDictionary লিগ্যাসি নন-জেনেরিক ক্লাস।
  • নতুন কোডে Dictionary<TKey, TValue> (সিঙ্গেল-থ্রেড) বা ConcurrentDictionary<TKey, TValue> (মাল্টি-থ্রেড) ব্যবহার করুন।
  • IsSynchronized প্রোপার্টি শুধু ইনফরমেশনাল - এটি false রিটার্ন করে, তাই আপনাকে নিজে সিঙ্ক্রোনাইজেশন হ্যান্ডেল করতে হয়।
  1. HTML Spell Check

  2. C#-তে ফাইল অস্তিত্ব (File Exists) চেক করা

  3. C#-তে ফাইল হিডেন (Hidden) কিনা চেক করা

  4. C#-এ অ্যারেতে ভ্যালু আছে কিনা চেক করা (Array.Exists)