예제 #1
0
        public async Task Should_allow_reconfiguration_at_runtime()
        {
            var currentCount = 0;
            var maxCount     = 0;

            ICommandRouter dynamicRouter = new CommandRouter();

            IPipe <InputContext> pipe = Pipe.New <InputContext>(cfg =>
            {
                cfg.UseConcurrencyLimit(1, dynamicRouter);
                cfg.UseExecuteAsync(async cxt =>
                {
                    var current = Interlocked.Increment(ref currentCount);
                    while (current > maxCount)
                    {
                        Interlocked.CompareExchange(ref maxCount, current, maxCount);
                    }

                    await Task.Delay(10);

                    Interlocked.Decrement(ref currentCount);
                });
            });

            await dynamicRouter.SendCommand <SetConcurrencyLimit>(new
            {
                ConcurrencyLimit = 32
            });

            var context = new InputContext("Hello");

            Task[] tasks = Enumerable.Range(0, 500)
                           .Select(index => Task.Run(async() => await pipe.Send(context)))
                           .ToArray();

            await Task.WhenAll(tasks);

            Assert.That(maxCount, Is.EqualTo(32));
        }