BsonBinaryReader с NetworkStream

Есть ли возможность сделать BsonBinaryReaderaccept неисключаемым потоком, например NetworkStream?

Таким образом, мне не нужно постоянно сохранять все данные и после этого начинать их анализировать, BsonBinaryReaderно может ли это произойти на лету?

Образец:

var response = new NetworkStream(MAGIC);
var reader = new BsonBinaryReader(response)

while (!reader.EndOfStream)
{
    if (reader.GotEnoughData())
    {
        var bson = BsonSerializer.Deserialize<BsonDocument>(reader);
    }
}

1 ответ

  1. Я решил вопрос, используя ответ от https://stackoverflow.com/a/28036366/1435802 с буфером 16MB (максимальный размер документа BSON) как входной сигнал к BsonBinaryReader.

    Для возможности чтения до конца потока я использовал следующее:

    public static Task WhileNotEndOfStreamAsync(this Stream stream, Action action, CancellationToken token = default(CancellationToken))
    {
        return Task.Run(() => {
            try
            {
                while (!token.IsCancellationRequested)
                {
                    action();
                }
            }
            catch (EndOfStreamException)
            {
                // Swallow the 'EndOfStream' Exception
            }
        }, token);
    }
    

    Для чтения данных до EOS:

    using (var response = new ReadSeekableStream(networkStream))
    using (var reader = new BsonBinaryReader(response))
    {
        await response.WhileNotEndOfStreamAsync(() =>
        {
            var bson = BsonSerializer.Deserialize<BsonDocument>(reader);
        }, token);
    }