示例#1
0
        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));
        }
示例#2
0
        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));
        }
示例#3
0
 static TaskEx()
 {
     TaskCompleted = FromResult(0);
     TaskContinue  = FromResult(Flow.Continue());
     TaskBreak     = FromResult(Flow.Return());
 }