C#并发列表访问

时间:2013-09-23 07:41:40

标签: c# multithreading list concurrency

有这个类,它允许在一个Thread中将数据写入流中并读入多个Thread。

它支持流媒体的主要目的,例如。网络或音频流,读取它并在多个线程中处理,允许数据随之而来。

http://www.codeproject.com/Articles/345105/Memory-Stream-Multiplexer-write-and-read-from-many?msg=4665022#xx4665022xx

MemoryStreamMultiplexer按块写入数据块并存储到List<byte[]> _Buffer变量中。

然后将_Buffer传递到MemoryStreamReader,如下所示:

new MemoryStreamReader(_Buffer, dataReady, finished);

MemoryStreamReader读取存储在此_Buffer列表中的byte []数组,检查数据是否存在

if (_bufferIndex < _bufferList.Count)
{
  return ReadInternal(buffer, offset, count);
}

ReadInternal从_Buffer列表中获取下一个缓冲区并在之后读取

byte[] currentBuffer = _bufferList[_bufferIndex];

现在,问题在于:随机,currentBuffer变为null,稍后会导致NullReferenceException。

在debug中,当currentBuffer声明为null时,如果我检查_bufferList [_bufferIndex]中的值 - 返回有效数组。所以这似乎是一些内存或并发问题。

我的想法是,在某些时候List决定改变它的容量,重新分配内部数组。当我们仍然在读List时,它返回null,因为内存地址已经改变但是还没有数据被复制到它中。

问题是 - 如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

这是稍微延长的producer-consumer problem

由于您正在使用C#(gc,内存将自动释放),我建议使用单独的同步队列创建每个Consumer,然后将相同的数据数组发布到每个队列。由于数据只有在被推送后才会被读取,所以多个线程同时访问它是完全安全的。

使用ConcurrentQueue可以省去同步的烦恼,这将为您节省大量的工作。