代码大致是这样的:
Queue<ITask> tasks = new Queue<ITask>();
添加:
tasks.Enqueue(value);
取值:
while (tasks.Count > 0)
{
  temp = tasks.Dequeue();

 }
多线程的环境,一个线程取值,多个线程添加。在不加锁的情况下,取值居然会取到null值。
希望用过Queue类的兄弟来聊聊这个类的性能、线程安全方面的情况。

解决方案 »

  1.   

    Queue是数组集合,表示对象的先进先出集合,存储在 Queue 中的对象在一端插入,从另一端移除。Queue 的容量是 Queue 可以保存的元素数。Queue 的默认初始容量为 32。向 Queue 添加元素时,将通过重新分配来根据需要自动增大容量.
    等比因子是当需要更大容量时当前容量要乘以的数字。在构造 Queue 时确定增长因子。默认增长因子为 2.0.
    Queue 接受 空引用(在 Visual Basic 中为 Nothing) 作为有效值并且允许重复的元素
      

  2.   

    我想知道的是取值时为什么会是null.
    是Enqueue进去时造成的null,还是Dequeue出来时发生的null.我试验出来的是Enqueue进去时造成的null。
      

  3.   

    添加的代码这样写,取值时还没出现问题:
    lock (tasks)
    {
        tasks.Enqueue(value);
    }
      

  4.   

    你这个是线程同步问题,不是 Queue 泛型类的问题...Queue 泛型类的公共静态(在 Visual Basic 中为 Shared)成员是线程安全的。但不能保证任何实例成员是线程安全的。只要不修改该集合,Queue 就可以同时支持多个阅读器。即便如此,从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。若要确保枚举过程中的线程安全,可以在整个枚举过程中锁定集合。若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。