缓冲流详细信息

时间:2014-05-20 13:18:21

标签: c# .net bufferedstream

我想用例子来解释我的理解。设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读取到网络。但也许我在使用缓冲流时并不在意?也许缓冲流消除了读写过程的中断?

0 个答案:

没有答案