ConcurrentQueue如何工作?

时间:2013-08-22 21:35:34

标签: c# queue

它是如何运作的?

我知道,你输入一个类型,然后你可以在另一个线程上接收它,同时也得到一个bool

但是我得不到它,它是如何发送物品的?

例如,在线程1中,我有一个字节数组,其中我写了一些数据,然后将它放入队列。

然后线程2将使用TryDequeue(out byte[])来接收它。 这是如何工作的?

作为TryDequeue,必须将其写入另一个byte[],所以我猜,它正在做某种复制吗?

意思是,如果线程1写入的byte[]public,则线程2可以更快/更好地读取它,因为它不必被复制?

虽然问题在于它不知道何时允许阅读。

编辑:

这是我使用它的一个例子:

while (True)
{
    var tempBytes = new byte[length];
    tempBytes.Write(....);
    Queue.Enqueue(tempBytes);
    read = true;
}



While(true)
{

    if (Queue.TryDequeue(out TextureData))
    {
         ................
    }              
});

因此,当线程1创建一个新的tempBytes时,给予线程2的引用是否会无效? 或者一个新的字节数组成为新的引用,这意味着它对线程2无关紧要?

编辑2:

修复了符合人们意愿的示例代码:)

1 个答案:

答案 0 :(得分:2)

  

作为TryDequeue,将不得不将其写入另一个字节[],所以我猜,它正在进行某种复制?

不,不。 .NET中的所有数组都是引用类型。所以Queue只存储并返回一个引用。

这也意味着排队数据的线程应该忘记它。 ConcurrentQuue不会使数组的内容成为“线程安全的”。

  

意思是,如果线程1写入的字节[]是公共的,则线程2可以更快/更好地读取它,因为它不必被复制?

publicprivate在此无关紧要。只要发送代码可以访问数组,它就可以工作。