public async Task <bool> SendAsync(string message, CancellationToken token)
    {
        if (m_Disposed)
        {
            throw new ObjectDisposedException(GetType().Name);
        }
        if (message == null)
        {
            throw new ArgumentNullException("message");
        }
        using (var messageTcs = new MessageTaskCompletionSource(message, token))
        {
            await AddAsync(messageTcs);

            return(await messageTcs.Task);
        }
    }
 private async Task AddAsync(MessageTaskCompletionSource message)
 {
     using (await m_Monitor.EnterAsync(message.Token))
     {
         if (m_CompleteSending)
         {
             throw new InvalidOperationException("Queue already completed.");
         }
         if (Capacity < m_MessageCollection.Count)
         {
             m_MessageCollection.RemoveAll(item => item.IsCanceled);
             if (Capacity < m_MessageCollection.Count)
             {
                 throw new QueueOverflowException(string.Format("Queue overflow; '{0}' couldn't be enqueued.", message.Message));
             }
         }
         m_MessageCollection.Add(message);
     }
     m_Monitor.Pulse();     // signal new message
     Console.WriteLine("Thread '{0}' - {1}: '{2}' enqueued.", Thread.CurrentThread.ManagedThreadId, DateTime.Now.TimeOfDay, message.Message);
 }