public ElevatorModel TakeClosestElevator(int floor)
        {
            if (!routeValidationService.IsFloorNumberCorrect(floor))
            {
                throw new ArgumentOutOfRangeException(nameof(floor));
            }

            lock (locker)
            {
                var orderedElevators = freeElevators
                                       .OrderBy(p => Math.Abs(p.Value.CurrentFloor - floor));

                if (!orderedElevators.Any())
                {
                    return(null);
                }

                var closestElevatorEntry = orderedElevators.First();

                freeElevators.TryRemove(closestElevatorEntry.Key, out var closestElevator);
                occupiedElevators.TryAdd(closestElevatorEntry.Key, closestElevator);

                elevatorEventLogService.LogEvent(closestElevator, "Called elevator");

                return(closestElevator);
            }
        }
示例#2
0
        public Task GoToFloorAsync(ElevatorModel elevator, int targetFloor)
        {
            if (elevator == null)
            {
                throw new ArgumentNullException(nameof(elevator));
            }

            if (!routeValidationService.IsFloorNumberCorrect(targetFloor))
            {
                throw new ArgumentOutOfRangeException(nameof(targetFloor));
            }

            return(GoToFloorInternalAsync(elevator, targetFloor));
        }