private async Task SynchronizeSubscriptionsAsync() { _logger.Info <ManagedMqttClient>(nameof(ManagedMqttClient), "Synchronizing subscriptions"); List <TopicFilter> subscriptions; List <string> unsubscriptions; await _subscriptionsSemaphore.WaitAsync().ConfigureAwait(false); try { subscriptions = _subscriptions.Select(i => new TopicFilter(i.Key, i.Value)).ToList(); unsubscriptions = new List <string>(_unsubscriptions); _unsubscriptions.Clear(); _subscriptionsNotPushed = false; } finally { _subscriptionsSemaphore.Release(); } if (!subscriptions.Any() && !unsubscriptions.Any()) { return; } try { if (subscriptions.Any()) { await _mqttClient.SubscribeAsync(subscriptions).ConfigureAwait(false); } if (unsubscriptions.Any()) { await _mqttClient.UnsubscribeAsync(unsubscriptions).ConfigureAwait(false); } } catch (Exception exception) { _logger.Warning <ManagedMqttClient>(exception, "Synchronizing subscriptions failed."); _subscriptionsNotPushed = true; SynchronizingSubscriptionsFailed?.Invoke(this, EventArgs.Empty); } }
private async Task SynchronizeSubscriptionsAsync() { _logger.Info(nameof(MqttManagedClient), "Synchronizing subscriptions"); List <TopicFilter> subscriptions; HashSet <string> unsubscriptions; lock (_subscriptions) { subscriptions = _subscriptions.Select(i => new TopicFilter(i.Key, i.Value)).ToList(); unsubscriptions = new HashSet <string>(_unsubscriptions); _unsubscriptions.Clear(); _subscriptionsNotPushed = false; } if (!subscriptions.Any() && !unsubscriptions.Any()) { return; } try { if (unsubscriptions.Any()) { await _mqttClient.UnsubscribeAsync(unsubscriptions).ConfigureAwait(false); } if (subscriptions.Any()) { await _mqttClient.SubscribeAsync(subscriptions).ConfigureAwait(false); } } catch (Exception exception) { _logger.Warning(exception, "Synchronizing subscriptions failed."); _subscriptionsNotPushed = true; SynchronizingSubscriptionsFailed?.Invoke(this, new MqttManagedProcessFailedEventArgs(exception)); } }