コード例 #1
0
        /// <summary>
        /// Asynchronously publishes the specified request message to a bus and waits for the correlated response message.
        /// </summary>
        /// <typeparam name="TRequestMessage">
        /// The type of the request message.
        /// </typeparam>
        /// <typeparam name="TResponseMessage">
        /// The type of the response message.
        /// </typeparam>
        /// <param name="requestMessage">
        /// The request message to publish.
        /// </param>
        /// <param name="controlToken">
        /// A token that ensures thread safety for the operation.
        /// </param>
        /// <returns>
        /// A task representing the asynchronous operation and containing the correlated response message.
        /// </returns>
        protected sealed override async Task <TResponseMessage> RequestAsync <TRequestMessage, TResponseMessage>(TRequestMessage requestMessage, ConcurrencyControlToken controlToken)
        {
            var requestMessageType            = typeof(TRequestMessage);
            var serializedRequestMessage      = SerializeMessage(requestMessage);
            var azureServiceBusRequestMessage = AzureServiceBusClientManager.CreateAzureServiceBusMessage(serializedRequestMessage, requestMessageType, MessageSerializationFormat, requestMessage.Identifier, requestMessage.CorrelationIdentifier);
            var requestClient = ClientManager.GetRequestClient <TRequestMessage, TResponseMessage>();

            ClientManager.AddOutstandingRequest(requestMessage.Identifier);

            using (var sendTask = requestClient.SendAsync(azureServiceBusRequestMessage))
            {
                using (var waitForResponseTask = ClientManager.WaitForResponseAsync(requestMessage.Identifier))
                {
                    await Task.WhenAll(sendTask, waitForResponseTask);

                    return(DeserializeMessage <TResponseMessage>(waitForResponseTask.Result.Body));
                }
            }
        }