예제 #1
0
 public static IObservable <ReadOnlyMemory <byte> > CreateObservable(this PipeFactory pfac, IPipeReader reader)
 {
     return(Observable.Create <ReadOnlyMemory <byte> >(async(ob, ct) =>
     {
         try
         {
             while (true)
             {
                 ct.ThrowIfCancellationRequested();
                 var result = await reader.ReadAsync();
                 if (result.IsCancelled || (result.IsCompleted && result.Buffer.IsEmpty))
                 {
                     break;
                 }
                 foreach (var rbuf in result.Buffer)
                 {
                     ob.OnNext(rbuf);
                 }
                 reader.Advance(result.Buffer.End);
             }
             ob.OnCompleted();
         }
         catch (Exception e)
         {
             try
             {
                 reader.CancelPendingRead();
             }
             catch
             {
             }
             ob.OnError(e);
         }
     }));
 }
예제 #2
0
            public void StopWriteToSocket()
            {
                PipeReader.CancelPendingRead();
                // unblock Writable (may race with CompleteWritable)
                Action continuation = Interlocked.Exchange(ref _writableCompletion, _stopSentinel);

                continuation?.Invoke();
            }
예제 #3
0
        public void Abort(Exception ex)
        {
            lock (_writeLock)
            {
                if (_completed)
                {
                    return;
                }

                _completed = true;
                _outputReader.CancelPendingRead();
                _outputWriter.Complete(ex);
            }
        }
예제 #4
0
        public void Abort(Exception error)
        {
            lock (_contextLock)
            {
                if (_completed)
                {
                    return;
                }

                _log.ConnectionDisconnect(_connectionId);
                _completed = true;

                _outputPipeReader.CancelPendingRead();
                _pipeWriter.Complete(error);
            }
        }