Beispiel #1
0
        public async Task Batch_Cooldown_Respected()
        {
            var lockRoot = new object();
            int numTotal = 0, currentParallel = 0, maxParallel = 0;

            async Task TestProcessor(int key, IEnumerable <string> k)
            {
                Interlocked.Increment(ref numTotal);
                Interlocked.Increment(ref currentParallel);
                await Task.Delay(200);

                lock (lockRoot) maxParallel = Math.Max(currentParallel, maxParallel);
                Interlocked.Decrement(ref currentParallel);
            }

            var q = new GroupedWorkQueue <int, string>(TestProcessor, 2);

            q.Enqueue(0, "Hello1");
            await Task.Delay(1);

            q.Enqueue(1, "Hello2");
            await Task.Delay(1);

            q.Enqueue(0, "Hello3");
            await q.Stop();

            Assert.Equal(2, numTotal);
            Assert.Equal(0, currentParallel);
        }
Beispiel #2
0
        public async Task Parallelism_Respected(int numParallel)
        {
            var numItems = numParallel * 2;
            var lockRoot = new object();
            int numTotal = 0, currentParallel = 0, maxParallel = 0;

            async Task TestProcessor(int key, IEnumerable <string> k)
            {
                Interlocked.Increment(ref numTotal);
                Interlocked.Increment(ref currentParallel);
                await Task.Delay(200);

                lock (lockRoot) maxParallel = Math.Max(currentParallel, maxParallel);
                Interlocked.Decrement(ref currentParallel);
            }

            var q = new GroupedWorkQueue <int, string>(TestProcessor, numParallel);

            for (var i = 0; i < numItems; ++i)
            {
                q.Enqueue(i, "Hello " + i);
            }
            await q.Stop();

            Assert.Equal(numItems, numTotal);
            Assert.Equal(0, currentParallel);
            Assert.InRange(maxParallel, numParallel == 1 ? 1 : 2, numParallel);
        }
Beispiel #3
0
        public async Task Count_Updated()
        {
            var l = new List <string[]>();

            async Task TestProcessor(int key, IEnumerable <string> k)
            {
                await Task.Delay(100);

                l.Add(k.ToArray());
            }

            var q = new GroupedWorkQueue <int, string>(TestProcessor);

            Assert.Equal(0, q.Count);
            Assert.Equal(0, q.GroupCount);
            q.Enqueue(0, "Hello");
            Assert.Equal(1, q.Count);
            Assert.Equal(1, q.GroupCount);
            q.Enqueue(0, "Hello");
            Assert.Equal(2, q.Count);
            Assert.Equal(1, q.GroupCount);
            await q.Stop();

            Assert.Equal(0, q.Count);
            Assert.Equal(0, q.GroupCount);
        }
Beispiel #4
0
        public async Task Add_Process_Items_With_Yield(int numItems)
        {
            var numTotal = 0;
            var counts   = new HashSet <int>();

            Task TestProcessor(int key, IEnumerable <int> k)
            {
                Interlocked.Increment(ref numTotal);
                lock (counts) counts.Add(key);
                return(Task.CompletedTask);
            }

            var q       = new GroupedWorkQueue <int, int>(TestProcessor, 2);
            var numKeys = Math.Min(numItems, 10);

            for (var i = 0; i < numItems; ++i)
            {
                q.Enqueue(i % 10, i);
                if (i < 10 || (i % 20 == 0))
                {
                    await Task.Delay(100);
                }
            }
            await q.Stop();

            Assert.InRange(numTotal, numKeys, numItems);
            Assert.Equal(numKeys, counts.Count);
        }
Beispiel #5
0
        public async Task Single_Item_Scheduled()
        {
            var l = new List <string[]>();

            async Task TestProcessor(int key, IEnumerable <string> k)
            {
                await Task.Delay(100);

                l.Add(k.ToArray());
            }

            var q = new GroupedWorkQueue <int, string>(TestProcessor);

            q.Enqueue(0, "Hello");
            await q.Stop();

            var result = l.Single().Single();

            Assert.Equal("Hello", result);
        }
Beispiel #6
0
        public async Task Batch_Timeout_Respected()
        {
            var      lockRoot = new object();
            int      numTotal = 0, currentParallel = 0, maxParallel = 0;
            TimeSpan maxElapsed = TimeSpan.Zero;

            async Task TestProcessor(int key, IEnumerable <Stopwatch> k)
            {
                var maxElapsedNow = k.Select(x => x.Elapsed).Max();

                Interlocked.Increment(ref numTotal);
                Interlocked.Increment(ref currentParallel);
                await Task.Delay(200);

                lock (lockRoot)
                {
                    maxParallel = Math.Max(currentParallel, maxParallel);
                    maxElapsed  = maxElapsed > maxElapsedNow ? maxElapsed : maxElapsedNow;
                }
                Interlocked.Decrement(ref currentParallel);
            }

            var q = new GroupedWorkQueue <int, Stopwatch>(TestProcessor, new GroupedWorkQueueOptions
            {
                Cooldown    = TimeSpan.FromMilliseconds(1000),
                Timeout     = TimeSpan.FromMilliseconds(500),
                Parallelism = 2
            });

            for (var i = 0; i < 10; ++i)
            {
                q.Enqueue(0, Stopwatch.StartNew());
                await Task.Delay(100);
            }
            await q.Stop();

            Assert.InRange(numTotal, 2, 10);
            Assert.InRange(maxElapsed, TimeSpan.FromMilliseconds(500), TimeSpan.FromMilliseconds(1500));
            Assert.Equal(0, currentParallel);
        }