Читать с C# Поток без занятого ожидания - PullRequest
0 голосов
/ 20 февраля 2020

Мне нужно прочитать контент из Stream в C#. Я не знаю, что это за стрим. Давайте предположим, что это сетевой поток и сеть очень медленная. Поэтому я не могу сразу прочитать все байты. Я знаю, что 4 байта в потоке являются целыми числами, и это int определяет длину содержимого, которое нам нужно получить из потока. Как это сделать без занятого ожидания (зацикливания)?

private (int headerValue, bool isSuccess) ReadHeader()
{
    var bytesRead = 0;
    var headerBuffer = new byte[BufferHeaderLength];
    var headerIsReady = false;

    while (!headerIsReady)
    {
        try
        {
            var availableBytesToRead = Math.Min(BufferHeaderLength - bytesRead, underlyingStream.Length); // should be a number from 0 to 4

            bytesRead += underlyingStream.Read(headerBuffer, bytesRead, (int)availableBytesToRead);

            if (bytesRead == 0)
            {
                break;
            }
        }
        catch (Exception)
        {
            break;
        }

        headerIsReady = bytesRead == BufferHeaderLength;
    }

    var headerValue = headerIsReady ? BitConverter.ToInt32(headerBuffer, 0) : 0;

    return (headerValue, headerIsReady);
}
...