我目前正在使用System.Collections.Concurrent.BlockingCollection,它的功能非常好。
然而,它似乎只保留了对象的引用。
所以,如果我有一个byte []对象,它被写入并添加到Queue中100次。
在达到100之后,我想阅读所有这些内容,我只会获得100份当前数据“byte []”保存。
希望能够解释它,至少它似乎是从我的测试中做到的。
所以,如果它这样做,是否有另一个可以保存数据的副本并只添加它并添加它直到我读到它?
例如,我会有100个byte []文件,以正确的顺序将它写入MemoryStream,然后我可以按顺序读取它们。
虽然记忆流不是我想要使用的,但作为一个例子。
这是我的代码:
try
{
Thread.Sleep(100);
for (int i = Queue.Count; i <= Queue.Count; i++)
if (Queue.TryTake(out AudioData, 300))
{
if (Record)
waveWriter.Write(AudioData, 0, AudioData.Length);
}
}
catch (Exception e)
{
if (e is ArgumentNullException)
return;
}
这是接收数据的部分
using (ms = new MemoryStream(TcpSize))
using (var tt1 = tcplisten.AcceptTcpClient())
{
ReceiveData = new byte[TcpSize];
tt1.NoDelay = true;
using (var tcpstream = tt1.GetStream())
while (connect)
{
if (Record)
Queue.Add(ReceiveData);
tcpstream.Read(ReceiveData, 0, TcpSize);
waveProvider.AddSamples(ReceiveData, 0, TcpSize);
}
}
您可能想知道为什么我使用for循环以及所有这些用于写入,但它只是用于调试目的。我想测试队列中的对象是否是副本,如果是这样的话,我写它的时候应该没关系,但这意味着它必须是引用。
由于
答案 0 :(得分:2)
如果要对数据的副本进行排队,只需复制一份,然后对副本进行排队。
Queue.Add((byte[])ReceiveData.Clone());
但我认为您还需要弄清楚在填充缓冲区之前将数据写入队列的事实......
或者,在每次迭代时创建一个新缓冲区并改为排队:
while (connect)
{
ReceiveData = new byte[TcpSize];
tcpstream.Read(ReceiveData, 0, TcpSize);
waveProvider.AddSamples(ReceiveData, 0, TcpSize);
if (Record)
Queue.Add(ReceiveData);
}