Итак, может показаться, что блокирующее Read () может вернуться до того, как оно завершится, получая все данные, отправляемые на него. В свою очередь, мы заключаем Read () в цикл, который управляется значением DataAvailable из рассматриваемого потока. Проблема в том, что вы можете получить больше данных в этом цикле while, но за кулисами не происходит обработки, позволяющей системе знать об этом. Большинство решений, которые я нашел для этого в сети, не были так или иначе применимы ко мне.
То, что я в итоге сделал, это последний шаг в моем цикле, я делаю простой Thread.Sleep (1) после чтения каждого блока из потока. Похоже, что это дает системе время для обновления, и я не получаю точных результатов, но это кажется немного хакерским и довольно «косвенным» для решения.
Вот список обстоятельств, с которыми я сталкиваюсь: Одно TCP-соединение между приложением IIS и автономным приложением, оба написаны на C # для отправки / получения связи. Он отправляет запрос, а затем ждет ответа. Этот запрос инициируется запросом HTTP, но у меня нет этой проблемы при чтении данных из запроса HTTP, это по факту.
Вот базовый код для обработки входящего соединения
protected void OnClientCommunication(TcpClient oClient)
{
NetworkStream stream = oClient.GetStream();
MemoryStream msIn = new MemoryStream();
byte[] aMessage = new byte[4096];
int iBytesRead = 0;
while ( stream.DataAvailable )
{
int iRead = stream.Read(aMessage, 0, aMessage.Length);
iBytesRead += iRead;
msIn.Write(aMessage, 0, iRead);
Thread.Sleep(1);
}
MemoryStream msOut = new MemoryStream();
// .. Do some processing adding data to the msOut stream
msOut.WriteTo(stream);
stream.Flush();
oClient.Close();
}
Приветствуются все отзывы о лучшем решении или просто большое спасибо за необходимость дать Sleep (1) возможность обновиться, прежде чем мы проверим значение DataAvailable.
Полагаю, я надеюсь, что через 2 года ответ на на этот вопрос не такой, как все есть :)