Я относительно новый для использования шаблона Async для чтения потока и записи, и спрашиваю, если ответ на этот вопрос настолько очевиден, он нигде не написано явно:Когда же поток EndRead блокировать обратный вызов
При вызова a NetworkStream.BeginRead
, я передаю параметр обратного вызова, который согласно MSDN выполняется «когда BeginRead завершает». В нем также говорится, что «ваш метод обратного вызова должен вызывать метод EndRead».
Затем в соответствии с документацией для NetworkStream.EndRead
«метод завершает асинхронную операцию чтения, запущенную методом BeginRead». В нем также упоминается, что этот метод «блокируется до тех пор, пока данные не будут доступны».
Я знаю, что метод EndRead также полезен для определения количества полученных байтов.
Мой вопрос:
Если метод EndRead вызывается в функции обратного вызова BeginRead, это когда-либо действительно блокировать? Не завершена ли операция чтения при вызове обратного вызова?
Пример кода
byte[] streamBuffer = new byte[1024];
public void SomeFunction()
{
TcpClient client = new TcpClient();
client.Connect(IPAddress.Parse("127.0.0.1"), 32000);
NetworkStream stream = client.GetStream();
stream.BeginRead(streamBuffer,0,streamBuffer.Length,ReadCallback,stream);
}
public void ReadCallback(IAsyncResult ar)
{
NetworkStream stream = ar.AsyncState as NetworkStream;
// Will this call ever actually "block" or will it
// return immediately? Isn't the read operation
// already complete?
int bytesRead = stream.EndRead(ar);
// Other stuff here
}
Пожалуйста, разместите код. – spender