private Task <string> ReceiveLoopAsync(BufferingContext bufferingContext, CancellationToken cancellationToken, int loop) { string response = null; return(TaskEx.AsyncLoopTask(() => { cancellationToken.ThrowIfCancellationRequested(); if (loop == -1 || --loop >= 0) { return TaskEx.FromResult(Flow <string> .Return(response)); } var encoding = bufferingContext.Encoding; var bufferBytes = bufferingContext.BufferBytes; var bufferChars = bufferingContext.BufferChars; var sb = bufferingContext.StringBuilder; return ReceiveMessageAsync(cancellationToken, bufferBytes, bufferChars, encoding, sb).ContinueWith(t => { response = t.Result; sb.Length = 0; return Flow <string> .Continue(); }, cancellationToken); }).ContinueWithTask(task => { if (cancellationToken.IsCancellationRequested) { return TaskEx.FromCanceled <string>(cancellationToken); } return TaskEx.FromResult(task.Result); }, cancellationToken) .CatchWith <string, Exception>(ex => ErrorReceived?.Invoke(this, new SocketErrorEventArgs { Exception = ex })) .UsingWith(bufferingContext)); }
private Task <string> ReceiveMessageAsync(CancellationToken cancellationToken, byte[] bufferBytes, char[] bufferChars, Encoding encoding, StringBuilder sb) { return(TaskEx.AsyncLoopTask(() => { cancellationToken.ThrowIfCancellationRequested(); var writeSegment = new ArraySegment <byte>(bufferBytes); return _clientWebSocket.ReceiveAsync(writeSegment, cancellationToken).ContinueWith(t => { var result = t.Result; DecodeFromBufferToStringBuilder(writeSegment, bufferChars, result.Count, encoding, sb); return result.EndOfMessage ? Flow <WebSocketReceiveResult> .Return(result) : Flow <WebSocketReceiveResult> .Continue(); }, cancellationToken); }).ContinueWith(task => { var response = sb.ToString(); _messageReceived?.Invoke(this, new MessageReceivedEventArgs { Message = response, CancellationToken = cancellationToken }); return response; }, cancellationToken)); }
static TaskEx() { TaskCompleted = FromResult(0); TaskContinue = FromResult(Flow.Continue()); TaskBreak = FromResult(Flow.Return()); }