예제 #1
0
        public ActorRef GetActor(Action <Inbox> initializer)
        {
            ActorInbox <TActor> inbox = null;

            Fiber fiber = _fiberFactory(new TryCatchOperationExecutor(ex =>
            {
                inbox.Send <Fault>(new
                {
                    ex.Message,
                    ex.StackTrace
                });
            }));

            Scheduler scheduler = _schedulerFactory();

            inbox = new ActorInbox <TActor>(fiber, scheduler);

            TActor instance = CreateActorInstance(fiber, scheduler, inbox);

            ApplyConventions(instance, fiber, scheduler, inbox);

            if (initializer != null)
            {
                fiber.Add(() => initializer(inbox));
            }

            return(inbox);
        }
예제 #2
0
        public ActorInstance Create(Action<Inbox> initializer)
        {
            Fiber fiber = _fiberFactory();
            Scheduler scheduler = _schedulerFactory();

            var inbox = new ActorInbox<AnonymousActor>(fiber, scheduler);

            _factory(fiber, scheduler, inbox);

            fiber.Add(() => initializer(inbox));

            return inbox;
        }
예제 #3
0
        public ActorInstance Create(Action <Inbox> initializer)
        {
            Fiber     fiber     = _fiberFactory();
            Scheduler scheduler = _schedulerFactory();

            var inbox = new ActorInbox <AnonymousActor>(fiber, scheduler);

            _factory(fiber, scheduler, inbox);

            fiber.Add(() => initializer(inbox));

            return(inbox);
        }
예제 #4
0
        public void Should_properly_invoke_the_message_receiver()
        {
            var inbox = new ActorInbox<MyActor>(new SynchronousFiber(), new TimerScheduler(new SynchronousFiber()));

            var received1 = new Future<Request<A>>();
            var received2 = new Future<Request<A>>();
            var responseChannel = new ChannelAdapter();

            Request<A> request1 = inbox.Request(new A(), responseChannel);
            Request<A> request2 = inbox.Request(new A(), responseChannel);

            inbox.Receive<Request<A>>(x => x.RequestId != request2.RequestId ? (Consumer<Request<A>>)null : received2.Complete);
            inbox.Receive<Request<A>>(x => x.RequestId != request1.RequestId ? (Consumer<Request<A>>)null : received1.Complete);

            received1.WaitUntilCompleted(2.Seconds()).ShouldBeTrue("1 not received");
            received2.WaitUntilCompleted(2.Seconds()).ShouldBeTrue("2 not received");
        }
예제 #5
0
        public void Should_properly_invoke_the_message_receiver()
        {
            var inbox = new ActorInbox <MyActor>(new SynchronousFiber(), new TimerScheduler(new SynchronousFiber()));

            var received1       = new Future <Request <A> >();
            var received2       = new Future <Request <A> >();
            var responseChannel = new ChannelAdapter();

            Request <A> request1 = inbox.Request(new A(), responseChannel);
            Request <A> request2 = inbox.Request(new A(), responseChannel);

            inbox.Receive <Request <A> >(x =>
                                         x.RequestId != request2.RequestId
                                          ? (Consumer <Request <A> >)null
                                          : received2.Complete);
            inbox.Receive <Request <A> >(x =>
                                         x.RequestId != request1.RequestId
                                          ? (Consumer <Request <A> >)null
                                          : received1.Complete);

            received1.WaitUntilCompleted(2.Seconds()).ShouldBeTrue("1 not received");
            received2.WaitUntilCompleted(2.Seconds()).ShouldBeTrue("2 not received");
        }
 protected virtual bool Visit <TActor>(ActorInbox <TActor> inbox)
     where TActor : class, Actor
 {
     Visit(inbox.Engine);
     return(true);
 }