protected override void Dispose(bool disposing) { if (disposing && !closedCancelSource.IsCancellationRequested) { writeBuffer.CloseWrite(); readBuffer.CloseRead(); try { Task.WhenAll(writeTask, readTask).Wait(); } catch (AggregateException) { } closedCancelSource.Cancel(); if (WriteStream != null) { WriteStream.Close(); } if (ReadStream != null) { ReadStream.Close(); } closedCancelSource.Dispose(); } base.Dispose(disposing); }
private async Task ProcessRead(Stream s) { readBuffer.WriteTimeout = Timeout.Infinite; var buf = new byte[64 * 1024]; var ct = closedCancelSource.Token; var canceledTask = new TaskCompletionSource <int>(); try { using (ct.Register(() => canceledTask.SetCanceled())) { var completed = await Task.WhenAny(s.ReadAsync(buf, 0, buf.Length, ct), canceledTask.Task).ConfigureAwait(false); var len = await completed.ConfigureAwait(false); while (len > 0) { await readBuffer.WriteAsync(buf, 0, len, ct).ConfigureAwait(false); completed = await Task.WhenAny(s.ReadAsync(buf, 0, buf.Length, ct), canceledTask.Task).ConfigureAwait(false); len = await completed.ConfigureAwait(false); } } socket.Shutdown(SocketShutdown.Receive); } catch (OperationCanceledException) { socket.Shutdown(SocketShutdown.Receive); } catch (IOException) { if (!ct.IsCancellationRequested) { throw; } } catch (ObjectDisposedException) { if (!ct.IsCancellationRequested) { throw; } } finally { readBuffer.CloseWrite(); } }