在 C# 开发中,Hashtable 是一种常用的键值对集合类型。然而,很多初学者在使用 Hashtable 时常常忽略一个关键问题:它的线程安全性。本文将深入浅出地讲解 C# Hashtable线程安全 的相关知识,帮助你避免常见的并发错误。

在 .NET Framework 中,Hashtable 是位于 System.Collections 命名空间下的一个非泛型集合类,用于存储键值对(key-value pairs)。它通过哈希算法快速查找、插入和删除数据。
using System;using System.Collections;class Program{ static void Main() { Hashtable ht = new Hashtable(); ht["name"] = "张三"; ht["age"] = 25; Console.WriteLine(ht["name"]); // 输出:张三 }}答案是:部分线程安全。
根据微软官方文档,Hashtable 的只读操作(如 Contains、GetEnumerator 等)在多个线程同时访问时是线程安全的。但一旦涉及写操作(如 Add、Remove、赋值等),就必须进行同步控制,否则会导致数据不一致、异常甚至程序崩溃。
下面是一个典型的并发错误示例:
using System;using System.Collections;using System.Threading.Tasks;class Program{ static Hashtable ht = new Hashtable(); static void Main() { // 启动两个线程同时写入 Hashtable Task t1 = Task.Run(() => { for (int i = 0; i < 1000; i++) ht[$"key_{i}"] = i; }); Task t2 = Task.Run(() => { for (int i = 1000; i < 2000; i++) ht[$"key_{i}"] = i; }); Task.WaitAll(t1, t2); Console.WriteLine($"最终元素数量:{ht.Count}"); // 预期应为 2000,但实际可能小于 2000,甚至抛出异常! }}运行上述代码,你可能会看到输出的元素数量少于 2000,或者直接抛出 InvalidOperationException 异常。这就是典型的 Hashtable并发问题。
每个 Hashtable 实例都有一个 SyncRoot 属性,可用于同步访问:
lock (ht.SyncRoot){ ht["newKey"] = "newValue";}.NET 提供了 Hashtable.Synchronized() 方法,返回一个线程安全的包装实例:
Hashtable safeHt = Hashtable.Synchronized(new Hashtable());// 现在可以安全地在多线程中使用 safeHtsafeHt["key"] = "value"; ⚠️ 注意:虽然 Synchronized 包装器保证了单个操作的线程安全,但如果需要执行“先检查再添加”这类复合操作,仍需手动加锁。在 .NET Framework 2.0 及更高版本中,建议使用泛型集合 ConcurrentDictionary<TKey, TValue>,它是专为多线程设计的高性能线程安全字典:
using System.Collections.Concurrent;ConcurrentDictionary<string, int> dict = new ConcurrentDictionary<string, int>();dict.TryAdd("count", 1); // 线程安全int value = dict.AddOrUpdate("count", 0, (key, old) => old + 1);相比 Hashtable,ConcurrentDictionary 不仅类型安全,而且性能更优,是处理 线程安全集合C# 场景的最佳选择。
Hashtable 默认不是完全线程安全的,写操作必须同步。SyncRoot 或 Synchronized 方法实现基本线程安全。ConcurrentDictionary<TKey, TValue> 替代 Hashtable。希望这篇教程能帮你彻底搞懂 C# Hashtable线程安全 的核心要点。如果你觉得有用,欢迎分享给更多开发者!
本文由主机测评网于2025-12-11发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126154.html