Детали буферизованного потока
Я хочу объяснить мое понимание на примере. Позволять 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);
Если я синхронно получаю и обрабатываю байты из буферизованного сетевого потока, могу ли я рассчитывать на то, что данные буфера потока будут передаваться сетевым потоком незаметно (асинхронно), не будут ReadByte
лагать весь код? Или это будет отставать в четыре раза редко?
PS я знаю, что стандарт NetworkStream
Поток буферизирован.
Хочу рассказать о моем конкретном случае. Я должен понять чередование потоков. Я читаю данные из потока с удаленного клиента и хочу передать их нескольким потокам на удаленные серверы, но с чередованием (это называется разветвлением) ( изображение а), например так
var i = 0;
while((c = inStream.Read(buf, 0, portions[i])) > 0)
{
outStreams[i].Write(buf, 0, c);
i = (i + 1) % outStreams.Length;
}
изображение б показывает процесс слияния, кодирование аналогичным образом.
Я не хочу обрекать удаленного клиента на ожидание, пока программа будет работать медленно Write
на удаленные серверы. Итак, я попытался организовать фоновую запись вручную из сети в inStream и фоновое чтение из outStreams в сеть. Но, может быть, мне все равно, когда я использую буферизованные потоки? Может быть, буферизованные потоки устраняют такие разрывы процессов чтения-записи?