关于ConcurrentQueue--一个队列缓存的设计

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Collections.Concurrent; namespace PDAJob.PDAService.Service { public class CacheList<T> { private int MaxSize = 10000; private int ShrinkLen = 2000; private ConcurrentQueue<CacheItem<T>> _Queue = new ConcurrentQueue<CacheItem<T>>(); public CacheList(int maxSize,int shrinkLen) { this.MaxSize = maxSize; this.ShrinkLen = shrinkLen; } public void Add(T item) { #region 超过则收缩 if (_Queue.Count >= MaxSize) { lock (this) { if (_Queue.Count >= MaxSize) { CacheItem<T> outItem; for (int i = 0; i < ShrinkLen; i++) { _Queue.TryDequeue(out outItem); } } } } #endregion _Queue.Enqueue(new CacheItem<T>() { Data = item, AddTime = DateTime.Now }); } public ConcurrentQueue<CacheItem<T>> Queue { get { return _Queue; } } } /// <summary> /// 缓存内容 /// </summary> /// <typeparam name="T"></typeparam> public class CacheItem<T> { public DateTime AddTime { get; set; } public T Data { get; set; } } }
在多线程环境下可能多个Thread读到Queue.Count>MaxSize,虽然Queue是Thread安全的,但是上面的代码可造成_Queue被重复移空,所以要加lock
标签:
ConcurrentQueue
, 一行代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2008-05-21 Winrar中命令行程序rar的使用