/// <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)); } } }