当前位置: 首页 > news >正文

C# 从 ConcurrentDictionary 中取出并移除第一个元素

C# 从 ConcurrentDictionary 中取出并移除第一个元素

要从 ConcurrentDictionary<byte, int> 中取出并移除第一个元素,需要结合 遍历 和 原子移除操作。由于 ConcurrentDictionary 是无序集合,"第一个元素" 通常是指最早添加的元素(按插入顺序)。

以下是几种实现方法:

方法 1:使用 TryRemove 结合 FirstOrDefault

// 获取第一个键值对(如果存在)
var firstPair = WorkerHandleMsg_Up.DI_TaskID.FirstOrDefault();if (firstPair.Key != default(byte)) // 检查是否有元素
{// 尝试原子性地移除该元素(可能已被其他线程移除)if (WorkerHandleMsg_Up.DI_TaskID.TryRemove(firstPair.Key, out int removedValue)){Console.WriteLine($"成功移除第一个元素: Key={firstPair.Key}, Value={removedValue}");}else{Console.WriteLine("元素已被其他线程移除");}
}
else
{Console.WriteLine("字典为空");
}

方法 2:使用 Keys 集合(更简洁)

if (WorkerHandleMsg_Up.DI_TaskID.Count > 0)
{// 获取第一个键(可能已被其他线程移除)byte firstKey = WorkerHandleMsg_Up.DI_TaskID.Keys.First();// 原子性地尝试移除该键if (WorkerHandleMsg_Up.DI_TaskID.TryRemove(firstKey, out int removedValue)){Console.WriteLine($"成功移除: Key={firstKey}, Value={removedValue}");}else{Console.WriteLine("元素已被其他线程移除");}
}
else
{Console.WriteLine("字典为空");
}

方法 3:循环尝试(高并发场景更可靠)

bool removed = false;
while (!removed && WorkerHandleMsg_Up.DI_TaskID.Count > 0)
{byte firstKey = WorkerHandleMsg_Up.DI_TaskID.Keys.First();removed = WorkerHandleMsg_Up.DI_TaskID.TryRemove(firstKey, out int removedValue);if (removed){Console.WriteLine($"成功移除: Key={firstKey}, Value={removedValue}");}// 否则继续尝试,直到成功或字典为空
}if (!removed)
{Console.WriteLine("字典为空或所有元素已被其他线程移除");
}

注意事项

1)线程安全

  • ConcurrentDictionary 的所有操作都是线程安全的
  • 上述代码在多线程环境下能正确工作,但不保证获取到的总是 "第一个" 元素(取决于并发操作)

2)顺序问题

  • ConcurrentDictionary 不保证元素顺序,"第一个元素" 通常是指最早添加的元素
  • 如果需要严格的顺序,请使用 ConcurrentQueue 或 ConcurrentBag

3)性能考虑

  • 方法 3 的循环尝试在极端高并发下可能影响性能,但更可靠
  • 大多数场景下,方法 1 或 2 已足够

扩展:如果需要有序集合

如果确实需要按插入顺序处理元素,建议改用 ConcurrentQueue<KeyValuePair<byte, int>>

// 声明时使用 ConcurrentQueue 代替 ConcurrentDictionary
private readonly ConcurrentQueue<KeyValuePair<byte, int>> DI_TaskID = new();// 添加元素
DI_TaskID.Enqueue(new KeyValuePair<byte, int>(di, taskId));// 取出并移除第一个元素(按插入顺序)
if (DI_TaskID.TryDequeue(out var firstElement))
{byte key = firstElement.Key;int value = firstElement.Value;Console.WriteLine($"移除第一个元素: Key={key}, Value={value}");
}

http://www.lqws.cn/news/131545.html

相关文章:

  • 【动手学MCP从0到1】2.1 SDK介绍和第一个MCP创建的步骤详解
  • 二维 根据矩阵变换计算镜像旋转角度
  • C++修炼:C++11(一)
  • 化学方程式配平免费API接口教程
  • webpack继续学习
  • 第12节 Node.js 函数
  • JAVA国际版一对一视频交友视频聊天系统源码支持H5+APP
  • Legal Query RAG(LQ-RAG):一种新的RAG框架用以减少RAG在法律领域的幻觉
  • 电力监控/能耗/云平台的数据集采、处理方式的浅析与展望
  • 使用 useSearchParams 的一个没有触发控制台报错的错误用法
  • Ros(俩不同包的节点 交流 topic message)
  • 蚂蚁森林自动收能量助手:Ant_Forest_1_5_4_3绿色行动新选择
  • Excel高级函数使用FILTER、UNIQUE、INDEX
  • selenium学习实战【Python爬虫】
  • 【仿生机器人】刀剑神域——爱丽丝苏醒计划,需求文档
  • DAY 21 常见的降维算法
  • 极速唤醒:高通平台 Android15 默认跳过锁屏,秒启主界面!
  • Java面试专项一-准备篇
  • 目标检测任务的评估指标mAP50和mAP50-95
  • 【推荐算法】Embedding+MLP:TensorFlow实现经典深度学习推荐模型详解
  • 网络编程之网络基础
  • (1-6-3)Java 多线程
  • .Net Framework 4/C# 面向对象编程进阶
  • 从上下文学习和微调看语言模型的泛化:一项对照研究 -附录
  • AI基础知识(LLM、prompt、rag、embedding、rerank、mcp、agent、多模态)
  • 【ArcGIS微课1000例】0148:Geographic Imager6.2使用教程
  • OpenCV CUDA模块图像处理------创建一个模板匹配(Template Matching)对象函数createTemplateMatching()
  • Fullstack 面试复习笔记:Java 基础语法 / 核心特性体系化总结
  • python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
  • x86 汇编逻辑运算全解析:从【位操作】到实际应用(AND,OR,NOT,XOR,TEST)