有这个类,它允许在一个Thread中将数据写入流中并读入多个Thread。
它支持流媒体的主要目的,例如。网络或音频流,读取它并在多个线程中处理,允许数据随之而来。
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,因为内存地址已经改变但是还没有数据被复制到它中。
问题是 - 如何解决这个问题?
答案 0 :(得分:2)
这是稍微延长的producer-consumer problem。
由于您正在使用C#(gc,内存将自动释放),我建议使用单独的同步队列创建每个Consumer,然后将相同的数据数组发布到每个队列。由于数据只有在被推送后才会被读取,所以多个线程同时访问它是完全安全的。
使用ConcurrentQueue可以省去同步的烦恼,这将为您节省大量的工作。