예제 #1
0
        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();
        }