小弟希望通过Queue <T>泛型类实现多线程异步操作, 但却在实际应用中, 遇到了十分奇怪的问题

1, 调用Queue <T>.Enqueue 方法时, 会不定时抛出ArgumentException, 错误消息为"源数组长度不足。请检查 srcIndex 和长度以及数组的下限。"
2, 调用Queue <T>.Dequeue 方法时, 会不定时返回0或null, 但队列中确从未添加过0或null.

在网上搜索了一遍, 没有找到相关资料, 只有在此劳烦园子里各位高手大哥相助了, 代码贴在下面, 具体的问题已标注在注释里面, 如下:

/// <summary>
/// 此类表示任务队列, 使用独立线程执行
/// </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 行为!相关推荐

  1. html钟无序列表不换行,风格无序列表中奇怪的换行符?

    我遇到了一个非常奇怪的特定问题,我将尝试将代码粘贴到此处,而不会将问题混淆得太多.我有一个无序的列表,它使用样式表将每个列表项放入一个小方块中......但是在某个点之后,该行会打破一切.如果你添加或 ...

  2. java int 127_Integer类型中奇怪的127和128

    原标题:Integer类型中奇怪的"127"和"128" 今天给大家带来的是Java中Integer类型的自动装箱 自动装箱:就是Java自动将原始类型值转换成 ...

  3. 奇怪的方式c语言,C语言中奇怪的C语言特性

    3)Duff's Device http://en.wikipedia.org/wiki/Duff%27s_device 特点是switch与while交错出现.代码类似 4)同名同姓现象 在< ...

  4. Go语言中奇怪的if语句

    常见的 if 语句大约是这个样子的(C++): Event event = getEvent(); if (event == EventA) {processA(event); } else {pro ...

  5. python queue 查询是否在队列中_python队列Queue的详解

    Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...

  6. 一篇图看清Java中的各种Queue

    说到数据结构,我们大概可以列出这么几个:数组,链表,栈,队列,集合,哈希表. 其中 队列 作为一个常用的数据结构,在Java中也有各种形式的实现. 顶级接口为java.util.queue. java ...

  7. 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, ...

  8. java如何实例化集合_如何在java中实例化一个Queue对象?

    Queue是一个接口,这意味着你不能直接构造一个Queue . 最好的select是构造一个已经实现Queue接口的类,如下所示: AbstractQueue , ArrayBlockingQueue ...

  9. js中奇怪的问题 同步ajax,modal遮罩层

    奇怪问题一 今天有一段js执行的时候出现了问题 $.ajax({ ..., async:false, ... }); $('#myModal').modal('hide'); loadcurrentp ...

  10. C++STL中的priority——queue

    文章目录 引用 基本操作 改变优先级 引用 引用需要加上头文件queue而不是priority_queue! #include <iostream> #include <queue& ...

最新文章

  1. (C++)A+B 输入输出练习VII 输入包含若干行,每行输入两个整数a和b,由空格分隔。 对于每组输入,输出a和b的和,每行输出后接一个空行。
  2. 外媒评李开复的《AI·未来》:四大浪潮正在席卷全球
  3. 数据结构:基数排序(Radix sort)
  4. 用python pandas三行代码实现excel转csv
  5. UIWebView中JS与OC交互 WebViewJavascriptBridge的使用
  6. GRE难句典型结构2
  7. 全国计算机等级考试题库二级C操作题100套(第42套)
  8. JS 三级联动 下拉列表
  9. antd table排序会触发到分页怎么解决_多年管理系统开发经验总结~代码解决方案...
  10. docker下配置linux7.2
  11. 企业信息管理系统汇总
  12. The Learnning of ROS Navigation Source Code---09-17
  13. 文献阅读与写作(一)
  14. 浏览器工作原理:浅析HTTP请求流程
  15. java 第三方库common系统详解
  16. 污水处理远程监控系统解决方案
  17. 金蝶ERP供应链之采购管理
  18. 阿龙的学习笔记--- B-树和B+树 以及 MySQL的索引机制总结
  19. java 集合数据类型_Java基础知识(数据类型和集合)
  20. android : 更新android 11 后 获取设备唯一码的方式

热门文章

  1. docker容器安装和配置实战
  2. 多方位全面解析:如何正确地写好一个iOS UI
  3. Unity调用Android类方法
  4. STM32 ucosii 串口接收数据 遇到的问题及解决思路
  5. 【YOLO家族】【论文翻译】YOLO v1 Unified, Real-Time Object Detection
  6. 十八、x86汇编基础
  7. C# 使用 quartz.net 做定时任务
  8. Iphone 清空联系人
  9. [CodeForces 372A] Counting Kangaroos is Fun
  10. 【教程】合成方法的那些事儿(附加练习源文件)