zoukankan      html  css  js  c++  java
  • .NetCore 线程安全的ConcurrentQueue<T>队列

    摘要:最近办了一件蠢事,我在一个高并发的订阅事件里对数据库执行I/O操作 ,坑了自己一把,虽然定时清除了数据,但是跑了一段时间之后还是出问题了,后面就加入了队列去存储一段时间的数据,解决了这个问题,操作内存和磁盘不是一个级别的.特别是高并发的情况下,最好别对磁盘进行I/O操作,用不好只能坑了自己.

    这里简单粘一下队列的使用方法,因为用的是多线程,就选择了ConcurrentQueue,还有一些别的Queue方法,有兴趣可以去搜一下.

    ConcurrentQueue<T>队列是一个高效的线程安全的队列,是.Net Framework 4.0,System.Collections.Concurrent命名空间下的一个数据结构

     ConcurrentQueue是一个先进先出的队列,常用的有以下几个方法:

    • Enqueue(T item)  将对象添加到队列的结尾处
    • TryDequeue(out T result)  尝试移除并返回并发队列开头处的对象
    • TryPeek(out T result)  尝试返回开头处的对象但不将其移除

    以下是我封装的常用类

        public class RingStringBuilder
        {
            private static ConcurrentQueue<RealTimeInfo> concurrentQueue = new ConcurrentQueue<RealTimeInfo>();
            private static int _maxCapacity;//队列最大值
    
            public RingStringBuilder(int maxCapacity)
            {
                _maxCapacity = maxCapacity;
            }
            /// <summary>
            /// 根据队列设置的最大值判断
            /// 超过最大值,移除队列第一条,队列末尾添加一条
            /// 没超过最大值,一直在队列尾部添加
            /// </summary>
            /// <param name="info"></param>
            public static void Append(RealTimeInfo info)
            {
                concurrentQueue.Enqueue(info);
                if (concurrentQueue.Count > _maxCapacity)
                {
                    concurrentQueue.TryDequeue(out info);
                }
            }
            /// <summary>
            /// 查询列表
            /// </summary>
            /// <returns></returns>
            public static List<RealTimeInfo> Query()
            {
                return concurrentQueue.ToList();
            }
    
            /// <summary>
            /// 获取最后一条数据
            /// </summary>
            /// <returns></returns>
            public static RealTimeInfo GetLastOrDefault()
            {
                return concurrentQueue.LastOrDefault();
            }
    
            /// <summary>
            /// 获取第一条数据
            /// </summary>
            /// <param name="info"></param>
            /// <returns></returns>
            public static RealTimeInfo GetFirstOrDefault(out RealTimeInfo info)
            {
                concurrentQueue.TryPeek(out info);
                return info;
            }
        }
  • 相关阅读:
    为什么要用webUI?
    探索WebKit内核(一)------ 菜鸟起步
    主进程退出的时候,杀死所有子进程
    那两年炼就的Android内功修养
    飞鸽---局域网聊天软件攻防战
    如何利用Fluxion诱惑目标用户获取WPA密码
    性能测试:CPU内存,硬盘IO读写,带宽速度,UnixBench
    解决maven编译错误:程序包com.sun.xml.internal.ws.spi不存在
    Apache-Flink深度解析-DataStream-Connectors之Kafka
    linux下find(文件查找)命令的用法总结
  • 原文地址:https://www.cnblogs.com/zhangjd/p/13409224.html
Copyright © 2011-2022 走看看