0

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

4

0 回答 0