Beispiel #1
0
        private async Task DrainQueue()
        {
            var batch = new List <Message>();

            try
            {
                Message message;
                while (Queue.TryDequeue(out message) && batch.Count < MaxBatchSize)
                {
                    batch.Add(message);
                }

                if (batch.Count > 0)
                {
                    // Limit number of concurrent clients
                    await HttpSemaphore.WaitAsync();

                    try
                    {
                        // Simulate network IO
                        await Task.Delay((int)NetworkDelay.TotalMilliseconds);

                        Interlocked.Add(ref Program.MessagesSent, batch.Count);
                    }
                    finally
                    {
                        HttpSemaphore.Release();
                    }
                }
            }
            finally
            {
                ActiveReaderSemaphore.Release();
            }
        }
Beispiel #2
0
        public void Enqueue(Message message)
        {
            Queue.Enqueue(message);

            if (Queue.Count > MaxBatchSize && ActiveReaderSemaphore.Wait(TimeSpan.FromMilliseconds(0)))
            {
                Task.Run(DrainQueue);
            }
        }
Beispiel #3
0
        private void Timer_Tick(object state)
        {
            var count   = Queue.Count;
            var readers = ActiveReaderLimit - ActiveReaderSemaphore.CurrentCount;
            var clients = ActiveHttpLimit - HttpSemaphore.CurrentCount;

            Console.WriteLine($"Timer Ticked: {count} messages queued - {readers} Active Readers - {clients} Active HTTP Clients.");

            if (ActiveReaderSemaphore.Wait(TimeSpan.FromMilliseconds(0)))
            {
                Task.Run(DrainQueue);
            }
        }