/// <summary>
        /// Mark a message as sent.
        /// </summary>
        /// <param name="message">The <see cref="T:ServiceBus.Queueing.QueuedMessage"/> that was sent.</param>
        /// <param name="messageContent">The raw message content.</param>
        public void Dequeue(QueuedMessage message, string messageContent)
        {
            message.HasSent = true;

            this._ftpClient.CreatePeerDirectoryIfNotExist(message.Envelope.Recipient);

            this._ftpClient.DeleteMessage(new Uri(message.MessageLocation(), UriKind.Relative));

            this._ftpClient.PutMessage(new Uri(message.SentLocation(), UriKind.Relative), messageContent);
        }
        /// <summary>
        /// Persist an <see cref="T:ServiceBus.Messaging.IMessage"/> and raise <see cref="E:IQueueManager.MessageQueue"/>.
        /// </summary>
        /// <typeparam name="TMessage">The type of <see cref="T:ServiceBus.Messaging.IMessage"/> to queue.</typeparam>
        /// <param name="envelope">The message to place into the queue.</param>
        /// <returns>
        /// An awaitable object representing the enqueue operation.
        /// </returns>
        public async Task EnqueueAsync <TMessage>(Envelope <TMessage> envelope) where TMessage : class, IMessage
        {
            var queuedMessage = new QueuedMessage {
                QueuedAt = DateTime.Now, Envelope = envelope, HasSent = false
            };

            var messageContent = this._messageSerialiser.Serialise(envelope);

            await this._ftpClient.CreatePeerDirectoryIfNotExist(envelope.Recipient);

            await this._ftpClient.PutMessage(new Uri(queuedMessage.MessageLocation(), UriKind.Relative), messageContent);

            if (this.MessageQueued != null)
            {
                await Task.Factory.StartNew(() => this.MessageQueued(queuedMessage));
            }
        }