public void Import(IBuffer buffer, IBuffer lastBuffer) { Interlocked.Add(ref _length, buffer.TotalBufferLength); bufferQueue.Enqueue(Tuple.Create(buffer, lastBuffer)); if (_readCompletionSource != null) { int len = Read(_readCompletionSource.Buffer, _readCompletionSource.Offset, _readCompletionSource.Count); _readCompletionSource.TrySetResult(len); _readCompletionSource = null; } }
public override Task <int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { if (!SSLConfirmed && SSL) { return(base.ReadAsync(buffer, offset, count, cancellationToken)); } else { if (Length > 0) { readCompletionSource = null; var len = Read(buffer, offset, count); return(Task.FromResult(len)); } else { readCompletionSource = new ReadTaskCompletionSource(); readCompletionSource.Buffer = buffer; readCompletionSource.Offset = offset; readCompletionSource.Count = count; return(readCompletionSource.Task); } } }
public Task <int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { if (Length > 0) { _readCompletionSource = null; var len = Read(buffer, offset, count); return(Task.FromResult(len)); } else { _readCompletionSource = new ReadTaskCompletionSource { Buffer = buffer, Offset = offset, Count = count }; cancellationToken.Register(() => { _readCompletionSource.TrySetCanceled(cancellationToken); _readCompletionSource = null; }); return(_readCompletionSource.Task); } }