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)); } }
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; } }); }