.net core 队列

      消息队列也是缓存的一种,那么队列通常什么时候才会用到呢?个人认为一般用在处理数据非常大,并发量量高的时候会用到,可以避免数据高峰期系统崩溃。试想一下,如果出现数据高峰期,把一些来不及处理的数据放在队列里,高峰期过后再慢慢处理,既减轻了服务器的压力,又不会造成数据的丢失,岂不是很好!

     今天我们用ConcurrentQueue 做一个消息队列。有些人可能会经常用Queue做消息队列,他们之间有什么区别吗?个人认为区别不大。但是ConcurrentQueue更优。为什么呢?ConcurrentQueue已经对线程安全做了封装,也就是说不用自己处理线程安全问题了,而Queue要做线程安全处理。

       我写了一个ConcurrentQueueHelper通用类,来对消息队列进行操作。

   public class ConcurrentQueueHelper<T> 
    {
        private static ConcurrentQueue<T> concurrentQueue = new ConcurrentQueue<T>();//定义一个消息队列
        private static int QueueMaxLenght=200;//队列最大值
        public static T OutT;
        public ConcurrentQueueHelper(int maxCapacity)
        {
            QueueMaxLenght = maxCapacity;
        }
        /// <summary>
        /// 清空缓存
        /// </summary>
        public static bool Clear()
        {
            int count = Query().Count;
            for (int i = 0; i < count; i++)
            {
                if (!concurrentQueue.TryDequeue(out OutT))
                {
                    return false;
                }
               
            }
            return true;
        }
        /// <summary>
        /// 根据队列设置的最大值判断
        /// 超过最大值,移除队列第一条,队列末尾添加一条
        /// 没超过最大值,一直在队列尾部添加
        /// </summary>
        /// <param name="info"></param>
        public static void Append(T t)
        {
            concurrentQueue.Enqueue(t);
            if (concurrentQueue.Count > QueueMaxLenght)
            { 
                concurrentQueue.TryDequeue(out t);
            }
        }
        /// <summary>
        /// 获取队列中元素的个数
        /// </summary>
        /// <returns></returns>
        public static int GetCount()
        {
            return concurrentQueue.Count;
        }
        /// <summary>
        /// 判断队列是否为空
        /// </summary>
        /// <returns></returns>
        public static bool GetEmpty()
        {
            return concurrentQueue.IsEmpty;
        }
        /// <summary>
        /// 尝试移除并返回并发队列开头处的对象
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public static bool RemoveQueue()
        {
            //Dequeue
            return concurrentQueue.TryDequeue(out OutT);
        }
        /// <summary>
        /// 查询列表
        /// </summary>
        /// <returns></returns>
        public static List<T> Query()
        {
            return concurrentQueue.ToList();
        }

        /// <summary>
        /// 获取最后一条数据
        /// </summary>
        /// <returns></returns>
        public static T GetLastOrDefault()
        {
            return concurrentQueue.LastOrDefault<T>();
        }

        /// <summary>
        /// 获取第一条数据,但是不会移除第一条记录
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public static T GetFirstOrDefault()
        {
            concurrentQueue.TryPeek(out OutT);
            return OutT;
        }
      
    }

为了测试,我们建两个模型 student类和animal类:

 public class Student
    {
        public string name { get; set; }
        public int number { get; set; }
        public int age { get; set; }
    }
  public class Animal
    {
        public string name { get; set; }
        public int age { get; set; }
    }

开始测试:

1,将Student信息和Animal信息放入队列中,然后将消息出队列。

class Program
{
static void Main(string[] args)
{


 for (int i = 0; i < 100; i++)
            {
                ConcurrentQueueHelper<Student>.Append(new Student { name = "张三", number = 123456, age = i });

            }
            for (int i = 0; i < 200; i++)
            {
                ConcurrentQueueHelper<Animal>.Append(new Animal { name = "哈巴狗", age = i });
               
            }
List<Animal> an = ConcurrentQueueHelper<Animal>.Query();//获取队列中所有数据
for (int i = 0; i < an.Count; i++)
{
Console.WriteLine(an[i].name + an[i].age);
}
List<Student> s= ConcurrentQueueHelper<Student>.Query();//获取队列中所有数据
for (int i = 0; i < s.Count; i++)
{
Console.WriteLine(s[i].name + s[i].age);
}

}}

 获取队列的第一条消息:

 Student stu = ConcurrentQueueHelper<Student>.GetFirstOrDefault();
 Console.WriteLine(stu.name+stu.age);

 获取队列的最后一个调信息:

 Animal a = ConcurrentQueueHelper<Animal>.GetLastOrDefault();
 Console.WriteLine(a.name + a.age);

 移除一条数据,清空数据。。。。。自己感兴趣的话可以测一下。这里就不多做介绍了!

  

   

原文地址:https://www.cnblogs.com/zpy1993-09/p/13525421.html