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