private async Task ProcessSends() { while (true) { var result = await Output.ReadAsync(); if (result.IsCanceled) { break; } var buffer = result.Buffer; var end = buffer.End; var isCompleted = result.IsCompleted; if (!buffer.IsEmpty) { await _sender.SendAsync(buffer); } // This is not interlocked because there could be a concurrent writer. // Instead it's to prevent read tearing on 32-bit systems. Interlocked.Add(ref _totalBytesWritten, buffer.Length); Output.AdvanceTo(end); if (isCompleted) { break; } } }
private async Task ProcessSends() { // Resolve `output` PipeReader via the IDuplexPipe interface prior to loop start for performance. var output = Output; while (true) { var result = await output.ReadAsync(); if (result.IsCanceled) { break; } var buffer = result.Buffer; var end = buffer.End; var isCompleted = result.IsCompleted; if (!buffer.IsEmpty) { await _sender.SendAsync(buffer); } output.AdvanceTo(end); if (isCompleted) { break; } } }
private async Task ProcessSends() { while (true) { // Wait for data to write from the pipe producer var result = await Output.ReadAsync(); var buffer = result.Buffer; if (result.IsCanceled) { break; } var end = buffer.End; var isCompleted = result.IsCompleted; if (!buffer.IsEmpty) { await _sender.SendAsync(buffer); } Output.AdvanceTo(end); if (isCompleted) { break; } } }
private async Task <Exception> DoSend() { Exception error = null; try { while (true) { // Wait for data to write from the pipe producer var result = await Output.ReadAsync(); var buffer = result.Buffer; if (result.IsCanceled) { break; } try { if (!buffer.IsEmpty) { await _sender.SendAsync(buffer); } else if (result.IsCompleted) { break; } } finally { Output.AdvanceTo(buffer.End); } } } catch (SocketException ex) when(ex.SocketErrorCode == SocketError.OperationAborted) { error = null; } catch (ObjectDisposedException) { error = null; } catch (IOException ex) { error = ex; } catch (Exception ex) { error = new IOException(ex.Message, ex); } finally { // Make sure to close the connection only after the _aborted flag is set. // Without this, the RequestsCanBeAbortedMidRead test will sometimes fail when // a BadHttpRequestException is thrown instead of a TaskCanceledException. _aborted = true; _trace.ConnectionWriteFin(ConnectionId); _socket.Shutdown(SocketShutdown.Both); } return(error); }