程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

C# 线程安全并发集合使用的简单例子

balukai 2025-01-07 10:51:43 文章精选 6 ℃

在C#中,有几种并发集合可用于在多线程环境中安全地访问和修改数据。

以下是一些常用的C#并发集合:

  • ConcurrentQueue:这是一个线程安全的队列,支持在队列的两端进行元素的插入和移除操作。
// 创建并发队列:
ConcurrentQueue queue = new ConcurrentQueue();
// 入队操作:
queue.Enqueue(item);
// 出队操作:
T item; 
bool success = queue.TryDequeue(out item);
// 获取队列长度:
int count = queue.Count;
  • ConcurrentStack:这是一个线程安全的栈,支持在栈的顶部进行元素的插入和移除操作。
// 创建并发栈:
ConcurrentStack stack = new ConcurrentStack();
// 入栈操作:
stack.Push(item);
// 出栈操作:
T item; 
bool success = stack.TryPop(out item);
// 获取栈顶元素:
bool success = stack.TryPeek(out item);
  • ConcurrentBag:这是一个线程安全的无序集合,可以用于存储任意类型的元素。
// 添加元素:
ConcurrentBag<int> bag = new ConcurrentBag<int>();
bag.Add(1);
bag.Add(2);
bag.Add(3);
// 移除元素:
int item;
if (bag.TryTake(out item))
{
    // 成功移除元素
}
// 遍历元素:
foreach (int item in bag)
{
    // 遍历元素
}
  • ConcurrentDictionary<TKey, TValue>:这是一个线程安全的字典,可以用于存储键值对。
// 创建并发字典:
ConcurrentDictionary<TKey, TValue> dictionary = new ConcurrentDictionary<TKey, TValue>();
// 添加或更新键值对:
dictionary[key] = value;
// 获取值:
bool success = dictionary.TryGetValue(key, out value);
// 删除键值对:
bool success = dictionary.TryRemove(key, out value);
// 获取字典中的所有键:
IEnumerable keys = dictionary.Keys;
// 获取字典中的所有值:
IEnumerable values = dictionary.Values;
  • ConcurrentHashSet:这是一个线程安全的集合,用于存储唯一的元素。
  • C# 中没有名为ConcurrentHashSet的内置类。但是,可以使用ConcurrentDictionary<T, bool>来模拟一个线程安全的哈希集合。
using System.Collections.Concurrent;
// 
ConcurrentDictionary<int, bool> concurrentHashSet = new ConcurrentDictionary<int, bool>();
// 添加元素
concurrentHashSet.TryAdd(1, true);
concurrentHashSet.TryAdd(2, true);
concurrentHashSet.TryAdd(3, true);
// 移除元素
concurrentHashSet.TryRemove(2, out _);
// 检查元素是否存在
bool contains = concurrentHashSet.ContainsKey(1);
// 遍历元素
foreach (var item in concurrentHashSet.Keys)
{
    // 处理元素
}

这些并发集合提供了线程安全的操作,可以在多个线程同时访问和修改数据,而无需显式地使用锁或其他同步机制。它们使用了内部的锁和其他同步机制来确保线程安全性。

使用并发集合时,需要注意它们的特性和适用场景。

例如,ConcurrentQueue和ConcurrentStack适用于先进先出(FIFO)和后进先出(LIFO)的数据访问模式,而ConcurrentDictionary适用于键值对的存储和检索。

最近发表
标签列表