我想用例子来解释我的理解。设stream
任何具有 4 字节缓冲区的抽象缓冲网络流。让有一些字节到字节的写入过程(像 FIFO 一样绘制)。
write->| | | | |----->net
----->net
操作很慢,我们想尽量减少它的数量。这里缓冲区有帮助。
write->| 1 | | | |----->net
write->| 5 | 1 | | |----->net
write->| 12 | 5 | 1 | |----->net
write->| 7 | 12 | 5 | 1 |----->net
在这里,或者,可能是更早的某个时间,.NET 虚拟机或操作系统决定完成写入操作并刷新数据:
write->| | | | |----->net 7 12 5 1->
因此,write->
操作变得非常快,并且至少在流关闭时延迟之后,数据被发送到远程主机。
在代码中,它可能如下所示:
using(networkStream)
for(var i = 0; i < 4; i++)
networkStream.WriteByte(getNextByte());
我对吗?如果getNextByte
操作会滞后一个线程,我可以指望数据会悄悄地(异步地)传递给流,不会WriteByte
滞后所有代码吗?还是很少会滞后四次?我没有实现一些循环缓冲区来将数据传递给它,并启动额外的线程来从缓冲区读取数据并将数据传递给网络流吗?
我也非常希望缓冲的网络流可以提高数据接收的速度。
read<-| | 1 | 5 | 12 |<-----net <-7
using(networkStream)
while((b = networkStream.ReadByte()) >= 0)
process(b);
如果我从缓冲的网络流中同步获取和处理字节,我可以指望流缓冲区的数据将由 networkStream 悄悄地(异步地)传输,不会ReadByte
滞后所有代码吗?还是很少会滞后四次?
PS我知道标准NetworkStream
流是缓冲的。
想谈谈我的具体案例。我必须实现流的条带化。我从远程客户端的流中读取数据,并希望将其传递给多个流到远程服务器,但是交替(称为分叉)(图像 a),像这样
var i = 0;
while((c = inStream.Read(buf, 0, portions[i])) > 0)
{
outStreams[i].Write(buf, 0, c);
i = (i + 1) % outStreams.Length;
}
图b显示了合并过程,编码方式相同。
我不想让远程客户端等待,而程序Write
对远程服务器操作的速度会很慢。因此,我尝试手动组织从网络到 inStream 的背景写入和从outStreams 到网络的背景读取。但也许我在使用缓冲流时不在乎?也许缓冲流消除了读写过程的这种中断?