/// <summary>
        /// Sends messages asynchronously. For PersistentMessage types, the
        /// MessageCorrelationContext provides caller to know if the message was
        /// acknowledge or not by the Solace Event Broker.
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public Task <MessageCorrelationContext> SendAsync(Message message)
        {
            using (var solaceMsg = SolaceNativeMsgAdapter.ConvertToNativeMsg(message))
            {
                var msgCtx = new MessageCorrelationContext(message, message.CorrelationId);
                var tcs    = new TaskCompletionSource <MessageCorrelationContext>();

                solaceMsg.CorrelationKey = new MessageTaskPair(msgCtx, tcs);

                ReturnCode rc;
                try
                {
                    rc = session.Send(solaceMsg);
                }
                catch (Exception e)
                {
                    solaceMsg.Dispose();
                    throw new MessagingException(e.Message, e);
                }
                switch (rc)
                {
                case ReturnCode.SOLCLIENT_OK:
                case ReturnCode.SOLCLIENT_IN_PROGRESS:
                    // OK
                    break;

                default:
                    throw new MessagingException("Send failure: " + rc.ToString());
                }

                if (!message.IsPersistent)
                {
                    // There will be no ack, immediately consider it acknowledged (complete synchronously)
                    tcs.SetResult(msgCtx);
                }

                return(tcs.Task);
            }
        }
 public MessageTaskPair(MessageCorrelationContext messageCorrelationContext,
                        TaskCompletionSource <MessageCorrelationContext> taskCompletionSource)
 {
     this.msgCorrelationContext = messageCorrelationContext;
     this.tcs = taskCompletionSource;
 }