private async Task ReadPipeAsync(PipeReader reader, CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { var result = await reader.ReadAsync(cancellationToken); ReadOnlySequence <byte> buffer = result.Buffer; bool canParse = false; do { canParse = _parser.CanParse(buffer); if (canParse) { ParseResult messageParsed = await _parser.ParseAsync(buffer); _whenMessageParsed.OnNext(messageParsed.CleanMessage); buffer = buffer.Slice(buffer.GetPosition(1, messageParsed.EndPosition)); } }while (canParse); reader.AdvanceTo(buffer.Start, buffer.End); if (result.IsCompleted) { break; } } reader.Complete(); }