private async Task ProcessWriteTasksAsync(Stream stream, SocketPayloadWriteTask writeTask) { if (writeTask == null) { return; } using (writeTask) { var timer = new Stopwatch(); try { _log.Debug(() => LogEvent.Create($"Writing {writeTask.Payload.Buffer.Length} bytes with correlation id {writeTask.Payload.CorrelationId} to {Endpoint}")); _configuration.OnWriting?.Invoke(Endpoint, writeTask.Payload); timer.Start(); await stream.WriteAsync(writeTask.Payload.Buffer, 0, writeTask.Payload.Buffer.Length, _disposeToken.Token).ConfigureAwait(false); timer.Stop(); _configuration.OnWritten?.Invoke(Endpoint, writeTask.Payload, timer.Elapsed); _log.Debug(() => LogEvent.Create($"Wrote {writeTask.Payload.Buffer.Length} bytes with correlation id {writeTask.Payload.CorrelationId} to {Endpoint}")); writeTask.Tcs.TrySetResult(writeTask.Payload); } catch (Exception ex) { var wrappedException = WrappedException(ex); _configuration.OnWriteFailed?.Invoke(Endpoint, writeTask.Payload, timer.Elapsed, wrappedException); writeTask.Tcs.TrySetException(wrappedException); throw; } } }
/// <inheritdoc /> public async Task <DataPayload> WriteAsync(DataPayload payload, CancellationToken cancellationToken) { var writeTask = new SocketPayloadWriteTask(payload, cancellationToken); await _writeTaskQueue.EnqueueAsync(writeTask, cancellationToken).ConfigureAwait(false); _configuration.OnWriteEnqueued?.Invoke(Endpoint, payload); return(await writeTask.Tcs.Task.ConfigureAwait(false)); }