C#中奇怪的Queue T 行为!
1, 调用Queue <T>.Enqueue 方法时, 会不定时抛出ArgumentException, 错误消息为"源数组长度不足。请检查 srcIndex 和长度以及数组的下限。"
2, 调用Queue <T>.Dequeue 方法时, 会不定时返回0或null, 但队列中确从未添加过0或null.
在网上搜索了一遍, 没有找到相关资料, 只有在此劳烦园子里各位高手大哥相助了, 代码贴在下面, 具体的问题已标注在注释里面, 如下:
/// 此类表示任务队列, 使用独立线程执行
/// </summary>
class TaskQueue
{
/// <summary>
/// 私用默认构造函数, 此处初始化任务执行线程.
/// </summary>
private TaskQueue()
{
Thread tdTask = new Thread(new ThreadStart(this.doTask));
tdTask.IsBackground = true;
tdTask.Start();
}
/// <summary>
/// 触发执行任务的事件.
/// </summary>
private ManualResetEvent _meventDoTask = new ManualResetEvent(false);
/// <summary>
/// 要执行的任务队列
/// </summary>
/// <remarks>
/// 注意: 此处设置了Queue<T>的容量为100万
/// , 如果不设置此容量 在调用 Queue<T>.Enqueue 方法时, 会不定时抛出异常ArgumentException
/// , 消息为"源数组长度不足。请检查 srcIndex 和长度以及数组的下限。"
/// </remarks>
private Queue<int> _taskQueue = new Queue<int>(1024 * 1024);
/// <summary>
/// 将任务编号排入队列, 并触发执行.
/// </summary>
/// <param name="taskId">任务编号</param>
private void QueueTask(int taskId)
{
if (taskId != 0)
{
//注意: taskId 在排入队列前, 已做了非0验证.
this._taskQueue.Enqueue(taskId);
this._meventDoTask.Set();
}
}
/// <summary>
/// 在此方法中, 执行任务
/// </summary>
private void doTask()
{
RETRY:
this._meventDoTask.WaitOne();
this._meventDoTask.Reset();
while (this._taskQueue.Count != 0)
{
//注意: _taskQueue 中从来不加入值为0的项, 但此处用Dequeue()得到的taskId依然会随机出现0值.
//另外, 经测试, 如果 _taskQueue 存储的不是值类型, 而是 类类型, 则Dequeue()方法得到的项会随便出现null.
int taskId = this._taskQueue.Dequeue();
if (taskId != 0)
{
//do the task
}
}
goto RETRY;
}
}
转载于:https://www.cnblogs.com/Betree/archive/2009/09/19/1569974.html
C#中奇怪的Queue T 行为!相关推荐
- html钟无序列表不换行,风格无序列表中奇怪的换行符?
我遇到了一个非常奇怪的特定问题,我将尝试将代码粘贴到此处,而不会将问题混淆得太多.我有一个无序的列表,它使用样式表将每个列表项放入一个小方块中......但是在某个点之后,该行会打破一切.如果你添加或 ...
- java int 127_Integer类型中奇怪的127和128
原标题:Integer类型中奇怪的"127"和"128" 今天给大家带来的是Java中Integer类型的自动装箱 自动装箱:就是Java自动将原始类型值转换成 ...
- 奇怪的方式c语言,C语言中奇怪的C语言特性
3)Duff's Device http://en.wikipedia.org/wiki/Duff%27s_device 特点是switch与while交错出现.代码类似 4)同名同姓现象 在< ...
- Go语言中奇怪的if语句
常见的 if 语句大约是这个样子的(C++): Event event = getEvent(); if (event == EventA) {processA(event); } else {pro ...
- python queue 查询是否在队列中_python队列Queue的详解
Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...
- 一篇图看清Java中的各种Queue
说到数据结构,我们大概可以列出这么几个:数组,链表,栈,队列,集合,哈希表. 其中 队列 作为一个常用的数据结构,在Java中也有各种形式的实现. 顶级接口为java.util.queue. java ...
- sketch钢笔工具_设计工具(Sketch,Adobe XD,Figma和InVision Studio)中奇怪的一项功能
sketch钢笔工具 When you build a new product that is very similar to the existing products in the market, ...
- java如何实例化集合_如何在java中实例化一个Queue对象?
Queue是一个接口,这意味着你不能直接构造一个Queue . 最好的select是构造一个已经实现Queue接口的类,如下所示: AbstractQueue , ArrayBlockingQueue ...
- js中奇怪的问题 同步ajax,modal遮罩层
奇怪问题一 今天有一段js执行的时候出现了问题 $.ajax({ ..., async:false, ... }); $('#myModal').modal('hide'); loadcurrentp ...
- C++STL中的priority——queue
文章目录 引用 基本操作 改变优先级 引用 引用需要加上头文件queue而不是priority_queue! #include <iostream> #include <queue& ...
最新文章
- (C++)A+B 输入输出练习VII 输入包含若干行,每行输入两个整数a和b,由空格分隔。 对于每组输入,输出a和b的和,每行输出后接一个空行。
- 外媒评李开复的《AI·未来》:四大浪潮正在席卷全球
- 数据结构:基数排序(Radix sort)
- 用python pandas三行代码实现excel转csv
- UIWebView中JS与OC交互 WebViewJavascriptBridge的使用
- GRE难句典型结构2
- 全国计算机等级考试题库二级C操作题100套(第42套)
- JS 三级联动 下拉列表
- antd table排序会触发到分页怎么解决_多年管理系统开发经验总结~代码解决方案...
- docker下配置linux7.2
- 企业信息管理系统汇总
- The Learnning of ROS Navigation Source Code---09-17
- 文献阅读与写作(一)
- 浏览器工作原理:浅析HTTP请求流程
- java 第三方库common系统详解
- 污水处理远程监控系统解决方案
- 金蝶ERP供应链之采购管理
- 阿龙的学习笔记--- B-树和B+树 以及 MySQL的索引机制总结
- java 集合数据类型_Java基础知识(数据类型和集合)
- android : 更新android 11 后 获取设备唯一码的方式