介绍开源的.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 ...
随机推荐
- MySQL—FOREIGN KEY
作用:保持数据一致性,完整性.实现一对一或一对多关系.(学习的过程中,老师说,实际的生产中,一般不使用物理上的外键约束的,都是使用逻辑上的外键约束) 要求: 父表与子表的存储引擎必须相等,而且只能是I ...
- JS中的闭包
在复习JS高程的过程中,在第七章闭包那节,发现自己看不太明白了.之前看高程的时候,都弄得挺清楚了,怎么现在反而又看不懂了. 嗯,也许更深层次的东西涉及到编译原理的知识了.嗯,在研究完SPA后就开始学习 ...
- MVVM架构~knockoutjs系列之为Ajax传递Ko数组对象
返回目录 一些要说的 这是一个很有意思的题目,在KO里,有对象和数组对象两种,但这两种对象对外表现都是一个function,如果希望得到他的值,需要进行函数式调用,如ko_a(),它的结果为一个具体值 ...
- EF架构~数据分批批量提交
回到目录 对于大数据量提交,包括插入,更新和删除,我始终不建议用EF自带的方法,因为它会增加与数据库的交互次数,一般地,EF的一个上下文在提交时会打开一个数据连接,然后把转换成的SQL语句一条一条的发 ...
- jQuery实现全选、全不选、反选
如图,需要使用jQuery实现全选.全不选.反选功能: 核心代码: 全选 $("#check_all").click(function(){ $("input:check ...
- Mybatis文档阅读笔记(明日继续更新...)
今天在编写mybatis的mapper.xml时,发现对sql的配置还不是很熟,有很多一坨一坨的东西,其实是可以抽取成服用的.不过良好的组织代码,还是更重要的.
- atitit。wondows 右键菜单的管理与位置存储
atitit.wondows 右键菜单的管理与位置存储 原理 .这样的功能称为Windows外壳扩展(Shell Extensions) 1 常用右键菜单 atiContentMenu1 通用tool ...
- angularJS自定义那些事
angularJS在数据处理方面很优秀. 使用angularJ给我感觉就像在写模板,然后对模板填入内容,只是这些内容不在是 在html页面编写,而是以数据的方式添加进去,这个也大大提高了编写的效率. ...
- Command /usr/bin/codesign failed with exit code 1
刚刚碰到相同的问题,自己解决了,很简单,profile冲突,(自己遇到的现象是之前的profile关联的certificate过期,然后重新生成 了certificate和更新了profile.但是是 ...
- 《BI那点儿事》数据挖掘各类算法——准确性验证
准确性验证示例1:——基于三国志11数据库 数据准备: 挖掘模型:依次为:Naive Bayes 算法.聚类分析算法.决策树算法.神经网络算法.逻辑回归算法.关联算法提升图: 依次排名为: 1. 神经 ...