private async Task EnsureMessageReceivingLinkIsOpenAsync(TimeSpan timeout, bool enableCallback = false) { if (_closed) { throw new IotHubException("Device is now offline.", false); } Logging.Enter(this, timeout, nameof(EnsureMessageReceivingLinkIsOpenAsync)); AmqpIotSession amqpIotSession = await EnsureSessionIsOpenAsync(timeout).ConfigureAwait(false); bool enteredSemaphore = await _messageReceivingLinkSemaphore.WaitAsync(timeout).ConfigureAwait(false); if (!enteredSemaphore) { throw new TimeoutException("Failed to enter the semaphore required for ensuring that AMQP message receiver links are open."); } try { if (_messageReceivingLink == null || _messageReceivingLink.IsClosing()) { _messageReceivingLink?.SafeClose(); _messageReceivingLink = await amqpIotSession.OpenMessageReceiverLinkAsync(_deviceIdentity, timeout).ConfigureAwait(false); _messageReceivingLink.Closed += (obj, arg) => { amqpIotSession.SafeClose(); }; Logging.Associate(this, this, _messageReceivingLink, nameof(EnsureMessageReceivingLinkIsOpenAsync)); } if (enableCallback) { _messageReceivingLink.RegisterReceiveMessageListener(OnDeviceMessageReceived); } } finally { _messageReceivingLinkSemaphore.Release(); Logging.Exit(this, timeout, nameof(EnsureMessageReceivingLinkIsOpenAsync)); } }
private async Task EnsureMessageReceivingLinkIsOpenAsync(CancellationToken cancellationToken, bool enableCallback = false) { if (_closed) { throw new IotHubException("Device is now offline.", false); } if (Logging.IsEnabled) { Logging.Enter(this, nameof(EnsureMessageReceivingLinkIsOpenAsync)); } AmqpIotSession amqpIotSession = await EnsureSessionIsOpenAsync(cancellationToken).ConfigureAwait(false); try { await _messageReceivingLinkSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); } catch (OperationCanceledException) { throw new TimeoutException("Failed to enter the semaphore required for ensuring that AMQP message receiver links are open."); } try { if (_messageReceivingLink == null || _messageReceivingLink.IsClosing()) { _messageReceivingLink?.SafeClose(); _messageReceivingLink = await amqpIotSession.OpenMessageReceiverLinkAsync(_deviceIdentity, cancellationToken).ConfigureAwait(false); if (_eventReceiverLinkDisconnected == null) { _eventReceiverLinkDisconnected = (obj, arg) => { amqpIotSession.SafeClose(); }; } _messageReceivingLink.Closed += _eventReceiverLinkDisconnected; if (Logging.IsEnabled) { Logging.Associate(this, this, _messageReceivingLink, nameof(EnsureMessageReceivingLinkIsOpenAsync)); } } if (enableCallback) { _messageReceivingLink.RegisterReceiveMessageListener(OnDeviceMessageReceived); } } finally { _messageReceivingLinkSemaphore.Release(); if (Logging.IsEnabled) { Logging.Exit(this, nameof(EnsureMessageReceivingLinkIsOpenAsync)); } } }