C#并发列表访问

阿维林

有一个此类,允许在一个线程中将数据写入流并在多个线程中读取。

它支持流的主要目的,例如。网络或音频流,对其进行读取并在多个线程中进行处理,以允许数据随其移动。

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。

在调试中,虽然currentBuffer被声明为null,但是如果我检查_bufferList [_bufferIndex]中的值,则会返回有效数组。因此,这似乎是内存或并发问题。

我的想法是,List决定在某个时候更改其Capacity,重新分配内部数组。当我们仍在读取列表时,它返回null,因为内存地址已经更改,但尚未将任何数据复制到其中。

问题是-如何解决此问题?

大流士

这是一个稍微扩大了的生产者-消费者问题

由于您使用的是C#(gc,内存将自动释放),我建议使用单独的同步队列创建每个Consumer,然后将相同的数据数组发布到每个队列中。由于仅在推送数据之后才读取数据,因此多个线程同时访问它是绝对安全的。

使用ConcurrentQueue将使您免于同步的麻烦,这反过来又可以节省很多工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章