public async Task EnableEventReceiveAsync(TimeSpan timeout) { if (Logging.IsEnabled) { Logging.Enter(this, timeout, $"{nameof(EnableEventReceiveAsync)}"); } try { Debug.Assert(_eventReceivingLink == null); _eventReceivingLink = await _amqpIoTSession.OpenEventsReceiverLinkAsync( _deviceIdentity, timeout ).ConfigureAwait(false); _eventReceivingLink.RegisterEventListener(OnEventsReceived); _eventReceivingLink.Closed += OnLinkDisconnected; if (Logging.IsEnabled) { Logging.Associate(this, this, _eventReceivingLink, $"{nameof(EnableEventReceiveAsync)}"); } } finally { if (Logging.IsEnabled) { Logging.Exit(this, timeout, $"{nameof(EnableEventReceiveAsync)}"); } } }
public async Task EnableEventReceiveAsync(TimeSpan timeout) { if (_closed) { throw new IotHubException("Device is now offline.", false); } if (Logging.IsEnabled) { Logging.Enter(this, timeout, $"{nameof(EnableEventReceiveAsync)}"); } AmqpIoTSession amqpIoTSession = await EnsureSessionAsync(timeout).ConfigureAwait(false); bool gain = await _eventReceivingLinkLock.WaitAsync(timeout).ConfigureAwait(false); if (!gain) { throw new TimeoutException(); } try { if (_eventReceivingLink == null || _eventReceivingLink.IsClosing()) { _eventReceivingLink?.SafeClose(); _eventReceivingLink = await amqpIoTSession.OpenEventsReceiverLinkAsync(_deviceIdentity, timeout).ConfigureAwait(false); _eventReceivingLink.Closed += (obj, arg) => { amqpIoTSession.SafeClose(); }; _eventReceivingLink.RegisterEventListener(OnEventsReceived); if (Logging.IsEnabled) { Logging.Associate(this, this, _eventReceivingLink, $"{nameof(EnableEventReceiveAsync)}"); } } } finally { _eventReceivingLinkLock.Release(); if (Logging.IsEnabled) { Logging.Exit(this, timeout, $"{nameof(EnableEventReceiveAsync)}"); } } }
public async Task EnableEventReceiveAsync(TimeSpan timeout) { if (_closed) { throw new IotHubException("Device is now offline.", false); } Logging.Enter(this, timeout, nameof(EnableEventReceiveAsync)); AmqpIoTSession amqpIoTSession = await EnsureSessionIsOpenAsync(timeout).ConfigureAwait(false); bool enteredSemaphore = await _eventReceivingLinkSemaphore.WaitAsync(timeout).ConfigureAwait(false); if (!enteredSemaphore) { throw new TimeoutException("Failed to enter the semaphore required for ensuring that AMQP event receiver links are open."); } try { if (_eventReceivingLink == null || _eventReceivingLink.IsClosing()) { _eventReceivingLink?.SafeClose(); _eventReceivingLink = await amqpIoTSession.OpenEventsReceiverLinkAsync(_deviceIdentity, timeout).ConfigureAwait(false); _eventReceivingLink.Closed += (obj, arg) => { amqpIoTSession.SafeClose(); }; _eventReceivingLink.RegisterEventListener(OnEventsReceived); Logging.Associate(this, this, _eventReceivingLink, nameof(EnableEventReceiveAsync)); } } finally { _eventReceivingLinkSemaphore.Release(); Logging.Exit(this, timeout, nameof(EnableEventReceiveAsync)); } }