我想用例子来解释我的理解。设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);
如果我同步获取并处理来自缓冲网络流的字节,我可以依靠netStream传输的数据到流缓冲区(异步),< strong>不会ReadByte
滞后所有代码吗?或者很少会落后四次?
P.S。我知道标准的NetworkStream
流是缓冲的。
想要讲述我的具体案例。我必须实现流的条带化。我从远程客户端的流中读取数据,并希望将其传递给多个流到远程服务器,但是交替(称为分叉)(image a),像这样
var i = 0;
while((c = inStream.Read(buf, 0, portions[i])) > 0)
{
outStreams[i].Write(buf, 0, c);
i = (i + 1) % outStreams.Length;
}
image b显示合并进程,编码方式相同。
我不想让远程客户端等待,而程序会慢慢Write
到远程服务器操作。因此,我尝试手动组织背景资料从网络写入inStream和背景资料从outStreams读取到网络。但也许我在使用缓冲流时并不在意?也许缓冲流消除了读写过程的中断?