public override async Task EnableTwinPatchAsync(CancellationToken cancellationToken) { if (Logging.IsEnabled) { Logging.Enter(this, cancellationToken, nameof(EnableTwinPatchAsync)); } try { cancellationToken.ThrowIfCancellationRequested(); string correlationId = AmqpTwinMessageType.Put + Guid.NewGuid().ToString(); using var ctb = new CancellationTokenBundle(_operationTimeout, cancellationToken); await _amqpUnit .SendTwinMessageAsync(AmqpTwinMessageType.Put, correlationId, null, ctb.Token) .ConfigureAwait(false); } finally { if (Logging.IsEnabled) { Logging.Exit(this, cancellationToken, nameof(EnableTwinPatchAsync)); } } }
public override async Task EnableTwinPatchAsync(CancellationToken cancellationToken) { Logging.Enter(this, cancellationToken, $"{nameof(EnableTwinPatchAsync)}"); try { cancellationToken.ThrowIfCancellationRequested(); await _amqpUnit.SendTwinMessageAsync(AmqpTwinMessageType.Put, Guid.NewGuid().ToString(), null, _operationTimeout).ConfigureAwait(false); } finally { Logging.Exit(this, cancellationToken, $"{nameof(EnableTwinPatchAsync)}"); } }
private async Task <AmqpMessage> RoundTripTwinMessage(AmqpMessage amqpMessage, CancellationToken cancellationToken) { if (Logging.IsEnabled) { Logging.Enter(this, amqpMessage, cancellationToken, $"{nameof(RoundTripTwinMessage)}"); } string correlationId = Guid.NewGuid().ToString(); AmqpMessage response = null; try { Outcome outcome; //SendingAmqpLink eventSendingLink = await this.GetTwinSendingLinkAsync(cancellationToken).ConfigureAwait(false); amqpMessage.Properties.CorrelationId = correlationId; var taskCompletionSource = new TaskCompletionSource <AmqpMessage>(); _twinResponseCompletions[correlationId] = taskCompletionSource; outcome = await _amqpUnit.SendTwinMessageAsync(amqpMessage, _operationTimeout).ConfigureAwait(false); if (outcome.DescriptorCode != Accepted.Code) { throw AmqpErrorMapper.GetExceptionFromOutcome(outcome); } var receivingTask = taskCompletionSource.Task; if (await Task.WhenAny(receivingTask, Task.Delay(TimeSpan.FromSeconds(ResponseTimeoutInSeconds))).ConfigureAwait(false) == receivingTask) { // Task completed within timeout. // Consider that the task may have faulted or been canceled. // We re-await the task so that any exceptions/cancellation is rethrown. response = await receivingTask.ConfigureAwait(false); } else { // Timeout happen throw new TimeoutException(); } } finally { _twinResponseCompletions.TryRemove(correlationId, out _); if (Logging.IsEnabled) { Logging.Exit(this, amqpMessage, cancellationToken, $"{nameof(RoundTripTwinMessage)}"); } } return(response); }
private async Task <Twin> RoundTripTwinMessage(AmqpTwinMessageType amqpTwinMessageType, TwinCollection reportedProperties, CancellationToken cancellationToken) { if (Logging.IsEnabled) { Logging.Enter(this, cancellationToken, $"{nameof(RoundTripTwinMessage)}"); } string correlationId = Guid.NewGuid().ToString(); Twin response = null; try { cancellationToken.ThrowIfCancellationRequested(); var taskCompletionSource = new TaskCompletionSource <Twin>(); _twinResponseCompletions[correlationId] = taskCompletionSource; await _amqpUnit.SendTwinMessageAsync(amqpTwinMessageType, correlationId, reportedProperties, _operationTimeout).ConfigureAwait(false); var receivingTask = taskCompletionSource.Task; if (await Task.WhenAny(receivingTask, Task.Delay(TimeSpan.FromSeconds(ResponseTimeoutInSeconds), cancellationToken)).ConfigureAwait(false) == receivingTask) { // Task completed within timeout. // Consider that the task may have faulted or been canceled. // We re-await the task so that any exceptions/cancellation is rethrown. response = await receivingTask.ConfigureAwait(false); if (response == null) { throw new InvalidOperationException("Service response is null"); } } else { // Timeout happen throw new TimeoutException(); } } finally { _twinResponseCompletions.TryRemove(correlationId, out _); if (Logging.IsEnabled) { Logging.Exit(this, cancellationToken, $"{nameof(RoundTripTwinMessage)}"); } } return(response); }