Exemplo n.º 1
0
        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 _);
            }
        }
Exemplo n.º 2
0
        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);
                    }
                }
            }
        }