ozbear Ответов: 0

Netstandard 2.0 system.io.pipelines peek реализация


У меня есть существующий проект, использующий интерфейс, который не может быть легко изменен, объявив метод под названием Peek().
Оригинальная реализация Peek смотрела на первый элемент внутреннего списка "байт", заполненный сокетом, байт за байтом,и возвращала байт.

Я экспериментировал с конвейерами и хотел получить соответствующий Peek (), который вернул бы первый байт PipeReader.Считыватель без выделения памяти, а также не беспокоить/удалять что-либо из канала считывателя, то есть вы можете вызывать его весь день напролет, и он будет возвращать один и тот же байт.

После долгих поисков в Google я ничего не нашел, кроме того, что он должен быть возможным.

Мой код, который работает, находится ниже. Мой вопрос в том, можно ли его улучшить?
Заранее спасибо за любой совет, Оз
Код следующий:

public byte Peek()
{
    ReadResult rr;
    var pipeHasData = readerPipe.Reader.TryRead(out rr);  // try to get a buffer in rr
    if (!pipeHasData) throw new ArgumentException("Peek called on empty pipeline");
    SequencePosition seqp = rr.Buffer.GetPosition(0);     // get sequence position to start of buffer
    readerPipe.Reader.AdvanceTo(seqp);                    // reset pipe position to beginning of buffer
    var roSeq = rr.Buffer.Slice(0, 1);                    // obtain ReadOnlySequence of 1 byte, not indexable
    var roSpan = roSeq.First.Span;                        // obtain ReadOnlySpan from sequence's ReadOnlyMemory (.First)
    return roSpan[0];                                     // return first byte of the Span, which is indexable
}


Что я уже пробовал:

Поиск решения в Google, но все документы в Интернете не предоставляют фактической реализации того, как это сделать.

Gerry Schmitz

Сделайте один в синем цвете.

0 Ответов