介绍开源的.net通信框架NetworkComms框架 源码分析(十二)PriorityQueue
原文网址: http://www.cnblogs.com/csdev
Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是:Apache License v2
开源地址是:https://github.com/MarcFletcher/NetworkComms.Net
优先级队列
/// <summary> /// Queue which contains features to add and remove items using a simple priority model. /// 优先级队列 包含一个简单的优先级类型 /// </summary> /// <typeparam name="TValue">The type of this queue</typeparam> public class PriorityQueue<TValue> { /// <summary> /// Each internal queue in the array represents a priority level. /// We keep the priority associated with each item so that when eventually returned the /// priority can be easily included. /// 内部字典 以优先级作为索引项 /// </summary> private Dictionary<QueueItemPriority,Queue<KeyValuePair<QueueItemPriority, TValue>>> internalQueues = null; /// <summary> /// The list of priorities used to handle incoming packets. /// 用于处理传入的数据包的优先级列表 /// </summary> private QueueItemPriority[] QueueItemPriorityVals; /// <summary> /// The number of queues we store internally. /// 存储在内部的队列数量 /// </summary> ; /// <summary> /// The total number of items currently in all queues /// 所有队列中的项目数 /// </summary> ; /// <summary> /// Create a new instance of the priority queue. /// 创建一个新的优先级队列项实例 /// </summary> public PriorityQueue() { var vals = Enum.GetValues(typeof(QueueItemPriority)) as int[]; Array.Sort(vals); this.numDistinctPriorities = vals.Length; QueueItemPriorityVals = new QueueItemPriority[numDistinctPriorities]; internalQueues = new Dictionary<QueueItemPriority,Queue<KeyValuePair<QueueItemPriority,TValue>>>(numDistinctPriorities); ; i < numDistinctPriorities; i++) { internalQueues[(QueueItemPriority)vals[i]] = new Queue<KeyValuePair<QueueItemPriority, TValue>>(); QueueItemPriorityVals[i] = (QueueItemPriority)vals[i]; } } /// <summary> /// Try adding an item to the priority queue. /// 添加项目到优先级队列项中 /// </summary> /// <param name="item">Key is priority, lower number is lower priority, and value is TValue</param> /// <returns>True if an item was successfully added to the queue</returns> public bool TryAdd(KeyValuePair<QueueItemPriority, TValue> item) { lock (internalQueues) { internalQueues[item.Key].Enqueue(item); Interlocked.Increment(ref totalNumberQueuedItems); } return true; } /// <summary> /// Try removing an item from the priority queue /// 从优先级队列中删除相应的项目 /// </summary> /// <param name="item">Key is priority, lower number is lower priority, and value is TValue</param> /// <returns>True if an item was successfully removed from the queue</returns> public bool TryTake(out KeyValuePair<QueueItemPriority, TValue> item) { // Loop through the queues in priority order. Higher priority first ; i >= ; i--) { // Lock the internal data so that the Dequeue // operation and the updating of m_count are atomic. lock (internalQueues) { ) { item = internalQueues[QueueItemPriorityVals[i]].Dequeue(); Interlocked.Decrement(ref totalNumberQueuedItems); return true; } else continue; } } // If we get here, we found nothing, return defaults item = , default(TValue)); return false; } /// <summary> /// Try removing an item from the priority queue which has a priority of at least that provided. /// 从优先级队列中删除相应的项目 删除的项目至少具有参数指定的优先级 /// </summary> /// <param name="minimumPriority">优先级 The minimum priority to consider</param> /// <param name="item">Key is priority, lower number is lower priority, and value is TValue</param> /// <returns>True if an item was successfully removed from the queue</returns> public bool TryTake(QueueItemPriority minimumPriority, out KeyValuePair<QueueItemPriority, TValue> item) { // Loop through the queues in priority order. Higher priority first ; i >= (int)minimumPriority; i--) { // Lock the internal data so that the Dequeue // operation and the updating of m_count are atomic. lock (internalQueues) { ) { item = internalQueues[QueueItemPriorityVals[i]].Dequeue(); Interlocked.Decrement(ref totalNumberQueuedItems); return true; } else continue; } } // If we get here, we found nothing, return defaults item = , default(TValue)); return false; } /// <summary> /// The total number of items currently queued. /// 目前排队项目总数 /// </summary> public int Count { get { return totalNumberQueuedItems; } } /// <summary> /// Copies queued items into the provided destination array. Highest priority items first descending until /// destination is full or there are no remaining items. /// 复制指定的优先级项目到数组中 从高优先级开始 /// </summary> /// <param name="destination">The destination array</param> /// <param name="destStartingIndex">The position within destination to start copying to</param> public void CopyTo(KeyValuePair<QueueItemPriority, TValue>[] destination, int destStartingIndex) { if (destination == null) throw new ArgumentNullException("destination", "Provided KeyValuePair<QueueItemPriority, TValue>[] cannot be null."); ) throw new ArgumentOutOfRangeException("destStartingIndex", "Provided int must be positive."); int remaining = destination.Length; KeyValuePair<QueueItemPriority, TValue>[] temp = this.ToArray(); for (int i = destStartingIndex; i < destination.Length && i < temp.Length; i++) destination[i] = temp[i]; } /// <summary> /// 复制所有的优先级项目到数组中 从高优先级开始 /// </summary> /// <returns></returns> public KeyValuePair<QueueItemPriority, TValue>[] ToArray() { KeyValuePair<QueueItemPriority, TValue>[] result; lock (internalQueues) { result = new KeyValuePair<QueueItemPriority, TValue>[this.Count]; ; ; i >= ; i--) { ) { internalQueues[QueueItemPriorityVals[i]].CopyTo(result, index); index += internalQueues[QueueItemPriorityVals[i]].Count; } } return result; } } /// <summary> /// Gets a value indicating whether access to the PriorityQueue is synchronized (thread safe). Always returns true. /// 获取一个值,指示是否使用PriorityQueue是同步(线程安全)。始终返回true。 /// </summary> public bool IsSynchronized { get { return true; } } /// <summary> /// Gets an object that can be used to synchronize access to the PriorityQueue. Throws an exception as all access is explicitly thread safe. /// 获取可用于同步访问一个对象的PriorityQueue 所有的访问都是现成安全时抛出异常 因为调用SyncRoot是不需要的 /// </summary> public object SyncRoot { get { throw new Exception("All access to PriorityQueue is thread safe so calling SyncRoot() is unnecessary."); } } /// <summary> /// Clear the content of all queues /// 清除队列的内容 /// </summary> public void Clear() { lock (internalQueues) { ; i < numDistinctPriorities; i++) internalQueues[QueueItemPriorityVals[i]].Clear(); } } }
介绍开源的.net通信框架NetworkComms框架 源码分析(十二)PriorityQueue的更多相关文章
- MyBatis框架的使用及源码分析(十二) ParameterHandler
在StatementHandler使用prepare()方法后,接下来就是使用ParameterHandler来设置参数,让我们看看它的定义: package org.apache.ibatis.ex ...
- DotNetty网络通信框架学习之源码分析
DotNetty网络通信框架学习之源码分析 有关DotNetty框架,网上的详细资料不是很多,有不多的几个博友做了简单的介绍,也没有做深入的探究,我也根据源码中提供的demo做一下记录,方便后期查阅. ...
- 深入理解分布式调度框架TBSchedule及源码分析
简介 由于最近工作比较忙,前前后后花了两个月的时间把TBSchedule的源码翻了个底朝天.关于TBSchedule的使用,网上也有很多参考资料,这里不做过多的阐述.本文着重介绍TBSchedule的 ...
- Spark RPC框架源码分析(二)RPC运行时序
前情提要: Spark RPC框架源码分析(一)简述 一. Spark RPC概述 上一篇我们已经说明了Spark RPC框架的一个简单例子,Spark RPC相关的两个编程模型,Actor模型和Re ...
- 设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)
1 智能生活项目需求 看一个具体的需求 1) 我们买了一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作. 2) 这些智能家电来自不同的厂家,我们不想针 ...
- 设计模式(二十一)——解释器模式(Spring 框架中SpelExpressionParser源码分析)
1 四则运算问题 通过解释器模式来实现四则运算,如计算 a+b-c 的值,具体要求 1) 先输入表达式的形式,比如 a+b+c-d+e, 要求表达式的字母不能重复 2) 在分别输入 a ,b, c, ...
- $Django cbv源码分析 djangorestframework框架之APIView源码分析
1 CBV的源码分析 #视图 class login (View): pass #路由 url(r'^books/$', views.login.as_view()) #阅读源码: #左侧工程栏--- ...
- ④NuPlayer播放框架之Renderer源码分析
[时间:2016-11] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,渲染器,render] 0 导读 之前我们分析了NuPlayer的实现代码,本文将重点聚 ...
- ⑤NuPlayer播放框架之GenericSource源码分析
[时间:2017-01] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,GenericSource] 0 导读 GenericSource是NuPlayer:: ...
- ③NuPlayer播放框架之类NuPlayer源码分析
[时间:2016-10] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架] 0 引言 差不多一个月了,继续分析AOSP的播放框架的源码.这次我们需要深入分析的是N ...
随机推荐
- Spring Trasnaction管理(2)- 事务AOP
问题导读 spring AOP是在如何进行的 spring 用cglib和jdkProxy管理的事务有何区别 Spring AOP管理 Spring主要的两个核心功能IOC与AOP.IOC的代码解析可 ...
- osgi 2
基础的API BundleActivator BundleContext ServiceReference HelloServiceFactory ServiceTracker osgi 疑惑: I ...
- JS中的闭包
在复习JS高程的过程中,在第七章闭包那节,发现自己看不太明白了.之前看高程的时候,都弄得挺清楚了,怎么现在反而又看不懂了. 嗯,也许更深层次的东西涉及到编译原理的知识了.嗯,在研究完SPA后就开始学习 ...
- Vuejs注意点
1.多级联动的时候,前一级变的时候,首先要把后面级的内容清空,要不然用户可能把前一次后面级的选择和新的前一级的选择提交(即后边级的列表渲染出来了,单但用户没有选择,此时vue绑定的是上一次的数据). ...
- 爱上MVC3~MVC+ZTree实现对树的CURD及拖拽操作
回到目录 上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除 ...
- [转载] fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)
说明: 转载自http://www.cnblogs.com/skywang12345/p/3308762.html概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对 ...
- 合法提交Html标签 Page指令
3.2.1 提交合法的HTML标签(1) 有时候我们需要让我们提交的文本展示出来的效果非常美观,通常会对服务器提交一些HTML标签来控制文本或内容的样式. HTML标签可能包含了很多不安全的因素,所以 ...
- Atitit 判断判断一张图片是否包含另一张小图片
Atitit 判断判断一张图片是否包含另一张小图片 1. keyword1 2. 模板匹配是在图像中寻找目标的方法之一(切割+图像相似度计算)1 3. 匹配效果2 4. 图片相似度的算法(感知哈希算 ...
- [ASP.net MVC] 将HTML转成PDF档案,使用iTextSharp套件的XMLWorkerHelper (附上解决显示中文问题)
原文:[ASP.net MVC] 将HTML转成PDF档案,使用iTextSharp套件的XMLWorkerHelper (附上解决显示中文问题) [ASP.net MVC] 将HTML转成PDF档案 ...
- 安装和使用的django的debug_toolbar
安装和使用的django的debug_toolbar Django Debug Toolbar安装 安装Django Debug Toolbar pip install django-debug-to ...