有一个此类,允许在一个线程中将数据写入流并在多个线程中读取。
它支持流的主要目的,例如。网络或音频流,对其进行读取并在多个线程中进行处理,以允许数据随其移动。
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] 删除。
我来说两句