private Task Run(IObserver <ReadOnlySequence <byte> > observer, CancellationToken cancellationToken) { return(Task.Factory.StartNew(() => { try { while (true) { Task <ReadResult> readTask = this.PipeReader.ReadAsync(cancellationToken).AsTask(); ReadResult readResult = readTask.Result; if (readResult.IsCompleted == true || readResult.IsCanceled == true) { this.OnCompleted(observer); break; } ReadOnlySequence <byte> buffer = readResult.Buffer; ITokenReaderState tokenReaderState = this.CreateTokenReaderState(); long offset = 0; while (this.TryRead(ref buffer, ref tokenReaderState, out ReadOnlySequence <byte> token, out long consumedBytes) == true) { offset = consumedBytes; this.OnNext(observer, token); } if (readResult.IsCanceled == false && readResult.IsCompleted == false) { SequencePosition position = new SequencePosition(); if (buffer.Length >= offset) { position = buffer.GetPosition(offset); } this.PipeReader.AdvanceTo(position, buffer.End); } } }catch (Exception ex) { this.OnError(observer, ex); }finally { this.Finished.Set(); } }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Default)); }
public bool Read(ref ITokenReaderState state, ref ReadOnlySequence <byte> buffer, out ReadOnlySequence <byte> token, out long consumedBytes) { token = new ReadOnlySequence <byte>(); consumedBytes = 0; bool messageFound = false; ITokenState tokenState = state.GetTokenState(); Stack <ITokenStateTransition> transitions = state.Transitions; long position = state.Position; ITokenStateTransition?currentTransition = null; do { currentTransition = this.GetNextTransition(currentTransition, tokenState, transitions, ref buffer, ref position); if (currentTransition is not null) { ExecutionLogProvider.Log.LogTrace(currentTransition.ToString()); tokenState = currentTransition.To; messageFound = this.HandleTransition(currentTransition, transitions, ref buffer, ref token, out consumedBytes); } }while(currentTransition is not null && messageFound == false); state = this.CreateTokenReaderState(position, transitions); return(messageFound); }
private bool TryRead(ref ReadOnlySequence <byte> buffer, ref ITokenReaderState tokenReaderState, out ReadOnlySequence <byte> token, out long consumedBytes) { token = new ReadOnlySequence <byte>(); consumedBytes = 0; long bufferLength = buffer.Length; if (bufferLength < this.MaximumMessageSize) { ITokenReader tokenReader = this.CreateTokenReader(); return(tokenReader.Read(ref tokenReaderState, ref buffer, out token, out consumedBytes)); } else { throw Assert.Exception(new InvalidOperationException($"Maximum message size exceeded.")); } }