public async Task <WirehomeDictionary> PublishRequestAsync(WirehomeDictionary message, TimeSpan timeout) { if (message == null) { throw new ArgumentNullException(nameof(message)); } var request = new MessageBusMessage { Message = message }; var responseSubscriber = new MessageBusResponseSubscriber(); try { _responseSubscribers.TryAdd(request.Uid, responseSubscriber); Publish(request); using (var timeoutCts = new CancellationTokenSource(timeout)) { await Task.Run(() => responseSubscriber.Task, timeoutCts.Token).ConfigureAwait(false); return(responseSubscriber.Task.Result.Message); } } finally { _responseSubscribers.TryRemove(request.Uid, out _); } }
public async Task <WirehomeDictionary> PublishRequestAsync(WirehomeDictionary message, TimeSpan timeout) { if (message == null) { throw new ArgumentNullException(nameof(message)); } var request = new MessageBusMessage { Message = message }; string requestCorrelationUid = null; try { var responseSubscriber = new MessageBusResponseSubscriber(); if (message.TryGetValue(MessageBusMessagePropertyName.CorrelationUid, out var buffer)) { requestCorrelationUid = Convert.ToString(buffer, CultureInfo.InvariantCulture); } else { requestCorrelationUid = Guid.NewGuid().ToString("D"); } _responseSubscribers.TryAdd(requestCorrelationUid, responseSubscriber); Publish(request); using (var timeoutCts = new CancellationTokenSource(timeout)) { var responseMessage = await Task.Run(() => responseSubscriber.Task, timeoutCts.Token).ConfigureAwait(false); return(responseMessage.Message); } } finally { if (requestCorrelationUid != null) { lock (_responseSubscribers) { _responseSubscribers.Remove(requestCorrelationUid); } } } }