Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C#

C# में StringCollection को सिंक्रोनाइज़ कैसे करें

StringCollection को थ्रेड-सेफ बनाने के लिए SyncRoot प्रॉपर्टी के साथ lock स्टेटमेंट का उपयोग करें।

उदाहरण 1: Array से StringCollection में AddRange

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: सीधे Add के साथ

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

महत्वपूर्ण बिंदु

  • StringCollection थ्रेड-सेफ नहीं है डिफ़ॉल्ट रूप से
  • SyncRoot लॉकिंग के लिए ऑब्जेक्ट प्रदान करता है
  • lock केवल एन्यूमरेशन ही नहीं, सभी एक्सेस (Add, Remove, Insert, Clear, Indexer) के लिए उपयोग करें
  • StringCollection नॉन-जेनेरिक है (केवल string स्टोर करता है)

आधुनिक विकल्प: ConcurrentBag / ConcurrentQueue / List + Lock

// थ्रेड-सेफ कलेक्शन्स (System.Collections.Concurrent)
var bag = new ConcurrentBag<string>();
bag.Add("Item1");  // थ्रेड-सेफ

var queue = new ConcurrentQueue<string>();
queue.Enqueue("Item1");  // थ्रेड-सेफ

// या List<T> + lock (अधिक कंट्रोल के लिए)
var list = new List<string>();
private readonly object _lock = new object();

lock (_lock) {
    list.Add("Item1");
    // अन्य ऑपरेशन्स
}

StringCollection vs आधुनिक विकल्प

विशेषताStringCollection + SyncRootConcurrentBag/QueueList + Lock
थ्रेड सेफ्टीमैन्युअलबिल्ट-इनमैन्युअल
ऑर्डर प्रिजर्वेशनहाँनहीं (Bag) / हाँ (Queue)हाँ
इंडेक्स एक्सेसहाँनहींहाँ
पेरफॉरमेंसमीडियमहाई (लॉक-मुक्त)मीडियम

सिफारिश

नए कोड के लिए Concurrent संग्रह या List<T> + समर्पित लॉक ऑब्जेक्ट का उपयोग करें। StringCollection लिगेसी है।

  1. - C# में Tuple का तीसरा तत्व कैसे प्राप्त करें?

    उदाहरण C# में Tuple का तीसरा तत्व Item3 प्रॉपर्टी के माध्यम से एक्सेस किया जाता है। इस उदाहरण में दो समान टपल बनाए गए हैं और उनके विभिन्न तत्व प्रिंट किए गए हैं। using System; public class Demo { public static void Main(String[] args) { var tuple1 = Tuple.Create(75, 200, 500, 700, 100,

  1. - C# में Tuple का छठा तत्व कैसे प्राप्त करें?

    उदाहरण C# में Tuple का छठा तत्व Item6 प्रॉपर्टी के माध्यम से एक्सेस किया जाता है। यह उदाहरण 7 तत्वों वाले टपल के सभी तत्वों को प्रिंट करता है। using System; public class Demo { public static void Main(String[] args) { var tuple1 = Tuple.Create(75, 200, 500, 700, 100, 1200, 1500);

  1. - C# में दो-आयामी सरणी से तत्वों तक कैसे पहुंचें

    2-आयामी सरणी को एक टेबल के रूप में सोचा जा सकता है, जिसमें x संख्या में पंक्तियां और y संख्या में कॉलम होते हैं। 2-आयामी सरणी में एक तत्व को सबस्क्रिप्ट्स का उपयोग करके एक्सेस किया जाता है। यानी, सरणी की पंक्ति इंडेक्स और कॉलम इंडेक्स। int x = a[1,1]; Console.WriteLine(x); आइए एक उदाहरण देखें जो द