예제 #1
0
        private void ReceivedResponse(IActorRef deviceActor, ITemperatureValue value, HashSet <IActorRef> stillWaiting, Dictionary <string, ITemperatureValue> repliesSoFar)
        {
            Context.Unwatch(deviceActor);
            var deviceId = DeviceMap[deviceActor];

            stillWaiting.Remove(deviceActor);
            repliesSoFar.Add(deviceId, value);
            if (stillWaiting.Count == 0)
            {
                Requester.Tell(new RespondAllTemperatures(RequestId, repliesSoFar));
                Context.Stop(Self);
            }
            else
            {
                Context.Become(WaitingForReplies(repliesSoFar, stillWaiting));
            }
        }
예제 #2
0
        private UntypedReceive WaitingForReplies(Dictionary <string, ITemperatureValue> repliesSoFar, HashSet <IActorRef> stillWaiting)
        {
            return(message =>
            {
                switch (message)
                {
                case RespondTemperature temperature when temperature.RequestId == 0:
                    var deviceActor = Sender;
                    ITemperatureValue value = null;
                    if (temperature.Value.HasValue)
                    {
                        value = new Temperature((double)temperature.Value);
                    }
                    else
                    {
                        value = TemperatureNotAvailable.Instance;
                    }

                    ReceivedResponse(deviceActor, value, stillWaiting, repliesSoFar);
                    break;

                case Terminated terminated:
                    ReceivedResponse(terminated.ActorRef, DeviceNotAvailable.Instance, stillWaiting, repliesSoFar);
                    break;

                case CollectionTimeout _:
                    var replies = new Dictionary <string, ITemperatureValue>(repliesSoFar);
                    foreach (var actorRef in stillWaiting)
                    {
                        replies.Add(DeviceMap[actorRef], DeviceTimedOut.Instance);
                    }

                    Requester.Tell(new RespondAllTemperatures(RequestId, replies));
                    Context.Stop(Self);
                    break;
                }
            });
        }