コード例 #1
0
ファイル: Observer_Specs.cs プロジェクト: slamj1/GreenPipes
        public void Should_be_called_when_send_faulted()
        {
            IPipeRouter router = new PipeRouter();

            router.ConnectPipe(Pipe.New <CommandContext <SetConcurrencyLimit> >(cfg =>
            {
                cfg.UseExecute(cxt =>
                {
                    throw new IntentionalTestException("Wow!");
                });
            }));

            var observer = new Observer <CommandContext <SetConcurrencyLimit> >();

            router.ConnectObserver(observer);

            var observer2 = new Observer();

            router.ConnectObserver(observer2);

            Assert.That(async() => await router.SetConcurrencyLimit(32), Throws.TypeOf <IntentionalTestException>());

            Assert.That(async() => await observer.SendFaulted, Throws.TypeOf <IntentionalTestException>());

            Assert.That(async() => await observer2.SendFaulted, Throws.TypeOf <IntentionalTestException>());
        }
コード例 #2
0
ファイル: Observer_Specs.cs プロジェクト: slamj1/GreenPipes
        public async Task Should_be_called_pre_send()
        {
            IPipeRouter router = new PipeRouter();

            router.ConnectPipe(Pipe.Empty <CommandContext <SetConcurrencyLimit> >());

            var observer = new Observer <CommandContext <SetConcurrencyLimit> >();

            router.ConnectObserver(observer);

            var observer2 = new Observer();

            router.ConnectObserver(observer2);

            await router.SetConcurrencyLimit(32);

            await observer.PreSent;

            Assert.That(async() => await observer2.PreSent, Is.InstanceOf <CommandContext <SetConcurrencyLimit> >());
        }
コード例 #3
0
        public async Task Should_allow_reconfiguration_at_runtime()
        {
            var currentCount = 0;
            var maxCount     = 0;

            IPipeRouter dynamicRouter = new PipeRouter();

            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.SetConcurrencyLimit(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));
        }