コード例 #1
0
            public TestAsyncHandler(IBus bus, TestAsyncHandlerHelper handlerHelper)
            {
                Bus = bus;

                Interlocked.Increment(ref handlerHelper.WaitingHandlerCount);
                handlerHelper.WaitTask.Wait();
            }
コード例 #2
0
        public void should_instanciate_new_message_context_aware_bus_for_every_handler_without_race_conditions()
        {
            var handlerData = new TestAsyncHandlerHelper();

            var container = new Container(x =>
            {
                x.ForSingletonOf <IBus>().Use(new TestBus());
                x.ForSingletonOf <TestAsyncHandlerHelper>().Use(handlerData);
            });

            var invoker = new AsyncMessageHandlerInvoker(container, typeof(TestAsyncHandler), typeof(ScanCommand1));

            var messageContext1 = MessageContext.CreateOverride(new PeerId("Abc.Testing.0"), null);
            var messageContext2 = MessageContext.CreateOverride(new PeerId("Abc.Testing.1"), null);

            var handler1 = Task.Run(() => (TestAsyncHandler)invoker.CreateHandler(messageContext1)).WaitForActivation();
            var handler2 = Task.Run(() => (TestAsyncHandler)invoker.CreateHandler(messageContext2)).WaitForActivation();

            Wait.Until(() => handlerData.WaitingHandlerCount == 2, 10.Seconds());
            handlerData.Release();

            Task.WaitAll(new Task[] { handler1, handler2 }, 10.Seconds());

            handler1.Result.Bus.ShouldNotEqual(handler2.Result.Bus);
            ((MessageContextAwareBus)handler1.Result.Bus).InnerBus.ShouldEqual(((MessageContextAwareBus)handler2.Result.Bus).InnerBus);
        }