📜  如何在C#中获得对HybridDictionary的同步访问

📅  最后修改于: 2021-05-29 23:39:44             🧑  作者: Mango

HybridDictionary.SyncRoot属性用于获取一个对象,该对象可用于同步对HybridDictionary的访问。它实现了链表和哈希表数据结构。当集合很小时,它通过使用ListDictionary实现IDictionary;而当集合很大时,它通过使用Hashtable来实现IDictionary。

重要事项:

  • 完成对象的同步,以便只有一个线程可以操纵HybridDictionary中的数据。
  • 属性是提供读取,写入和计算私有数据字段的手段的类的成员。
  • 同步代码不能直接在集合上执行,因此它必须在集合的SyncRoot上执行操作,以保证从其他对象派生的集合的正确操作。
  • 检索此属性的值是O(1)操作。

下面的程序说明了上面讨论的属性的用法:

示例1:在此代码中,我们使用SyncRoot获得对名为hd的HybridDictionary的同步访问,这不是线程安全的过程,并且可能导致异常。因此,为避免异常,我们在枚举期间锁定了集合。

// C# program to illustrate the
// use of SyncRoot property of
// the HybridDictionary class
using System;
using System.Threading;
using System.Collections;
using System.Collections.Specialized;
  
namespace sync_root {
  
class GFG {
  
    // Main Method
    static void Main(string[] args)
    {
  
        // Declaring an HybridDictionary
        HybridDictionary hd = new HybridDictionary();
  
        // Adding elements to HybridDictionary
        hd.Add("1", "HTML");
        hd.Add("2", "CSS");
        hd.Add("3", "PHP");
        hd.Add("4", "JQuery");
        hd.Add("5", "JavaScript");
  
        // Using the SyncRoot property
        lock(hd.SyncRoot)
        {
            // foreach loop to display
            // the elements in hd
            foreach(DictionaryEntry i in hd)
                Console.WriteLine(i.Key + " ---- " + i.Value);
        }
    }
}
}
输出:
1 ---- HTML
2 ---- CSS
3 ---- PHP
4 ---- JQuery
5 ---- JavaScript

范例2:

// C# program to illustrate the
// use of SyncRoot property of
// the HybridDictionary class
using System;
using System.Threading;
using System.Collections;
using System.Collections.Specialized;
  
namespace sync_root {
  
class GFG {
  
    // Main Method
    static void Main(string[] args)
    {
  
        // Declaring an HybridDictionary
        HybridDictionary hd= new HybridDictionary();
  
        // Adding elements to HybridDictionary
        hd.Add("10", "Shyam");
        hd.Add("20", "Ram");
        hd.Add("30", "Rohit");
        hd.Add("40", "Sohan");
        hd.Add("50", "Rohan");
  
        // Using the SyncRoot property
        lock(hd.SyncRoot)
        {
            // foreach loop to display
            // the elements in hd
            foreach(DictionaryEntry i in hd)
                Console.WriteLine(i.Key + " ----> " + i.Value);
        }
    }
}
}
输出:
10 ----> Shyam
20 ----> Ram
30 ----> Rohit
40 ----> Sohan
50 ----> Rohan

参考:

  • https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.specialized.hybriddictionary.syncroot?view=netframework-4.7.2