Попробуйте отправить мегабайты данных по медленной ссылке.Зачем потоку нужно подождать, пока он не наберет all , прежде чем передать вызывающему что-либо из этого?Что делать, если другая сторона не закрыла соединение - там - это , на данном этапе нет понятия «все данные».
Предположим, вы открываете соединение с другим сервером и звоните BeginRead
(или Read
) с большим буфером, но он отправляет только 100 байтов, затем ждет вашего ответа - что вы ожидаете от NetworkStream
?Никогда не дайте вам данные, потому что вы дали слишком большой буфер?Это было бы крайне контрпродуктивно.
Вы должны абсолютно не предполагать, что какой-либо поток (за возможным аргументом MemoryStream
) заполнит буфер, который вы ему дадите.Возможно, что FileStream
всегда будет для локальных файлов, но я бы ожидал , а не для общих файлов.
EDIT: Пример кода, который показывает, что буфер не заполняется - созданиеЗапрос HTTP 1.1 (довольно плохо:)
// Please note: this isn't nice code, and it's not meant to be. It's just quick
// and dirty to demonstrate the point.
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
class Test
{
static byte[] buffer;
static void Main(string[] arg)
{
TcpClient client = new TcpClient("www.yoda.arachsys.com", 80);
NetworkStream stream = client.GetStream();
string text = "GET / HTTP/1.1\r\nHost: yoda.arachsys.com:80\r\n" +
"Content-Length: 0\r\n\r\n";
byte[] bytes = Encoding.ASCII.GetBytes(text);
stream.Write(bytes, 0, bytes.Length);
stream.Flush();
buffer = new byte[1024 * 1024];
stream.BeginRead(buffer, 0, buffer.Length, ReadCallback, stream);
Console.ReadLine();
}
static void ReadCallback(IAsyncResult ar)
{
Stream stream = (Stream) ar.AsyncState;
int bytesRead = stream.EndRead(ar);
Console.WriteLine(bytesRead);
Console.WriteLine("Asynchronous read:");
Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytesRead));
string text = "Bad request\r\n";
byte[] bytes = Encoding.ASCII.GetBytes(text);
stream.Write(bytes, 0, bytes.Length);
stream.Flush();
Console.WriteLine();
Console.WriteLine("Synchronous:");
StreamReader reader = new StreamReader(stream);
Console.WriteLine(reader.ReadToEnd());
}
}