public void Start() { if (_liftNum == 0) { Console.WriteLine("楼房{0}无电梯!", _building.Name); return; } for (int i = 0; i < _liftNum; i++) { LiftEntity lift = new LiftEntity(i, _building); lift.Start(); _lifts.Add(lift); ThreadPool.QueueUserWorkItem(LiftWork, lift); } ThreadPool.QueueUserWorkItem(ManagerWork, _passengers); }
private void LiftWork(object obj) { while (true) { LiftEntity lift = (LiftEntity)obj; Console.WriteLine("Lift[{0}] is {1} at {2}", lift.ID, lift.Direction.ToString(), lift.CurrentFloor); Console.WriteLine("Lift[{0}] InTargets:{1}", lift.ID, lift.InTargets.Count); Console.WriteLine("Lift[{0}] OutTargets:{1}", lift.ID, lift.OutTargets.Count); if (lift.InTargets.Contains(lift.CurrentFloor) || lift.OutTargets.Contains(lift.CurrentFloor)) { lift.Status = LiftStatusEnum.OUT_IN; Console.WriteLine("Lift[{0}]: Out Or In", lift.ID); } else if (lift.InTargets.Any() || lift.OutTargets.Any()) { lift.Status = LiftStatusEnum.Running; //根据InTarget和OutTarget,修正最佳方向 if (lift.OutTargets.Count == 0) { if (lift.InTargets.All(it => it < lift.CurrentFloor)) { lift.Direction = LiftDirectionEnum.Down; } else if (lift.InTargets.All(it => it > lift.CurrentFloor)) { lift.Direction = LiftDirectionEnum.Up; } } Console.WriteLine("Lift[{0}]: Running", lift.ID); } else { lift.Status = LiftStatusEnum.Paused; Console.WriteLine("Lift[{0}]: Paused", lift.ID); } if (lift.Status == LiftStatusEnum.OUT_IN) { if (lift.InTargets.Contains(lift.CurrentFloor)) { var passengers = lift.RequestInPassengers.Where(p => p.CurrentFloor == lift.CurrentFloor).ToList(); for (int i = 0; i < passengers.Count; i++) { var passenger = passengers[i]; Console.WriteLine("Lift[{0}]: Passenger[{1}] IN", lift.ID, passenger.ID); lift.CurrentPeopleNum++; lift.CurrentLoad += passenger.Weight; if (!lift.OutTargets.Contains(passenger.TargetFloor)) { lift.OutTargets.Add(passenger.TargetFloor); } lift.RequestOutPassengers.Add(passenger); lift.RequestInPassengers.Remove(passenger); lift.InTargets.Remove(lift.CurrentFloor); passengers.Remove(passenger); i--; //没有新需求,电梯直接去接乘客 if (lift.InTargets.Count == 0) { if (lift.CurrentFloor == passenger.CurrentFloor) { lift.Direction = passenger.Direction; } } } } if (lift.OutTargets.Contains(lift.CurrentFloor)) { var passengers = lift.RequestOutPassengers.Where(p => p.TargetFloor == lift.CurrentFloor).ToList(); for (int i = 0; i < passengers.Count; i++) { var passenger = passengers[i]; Console.WriteLine("Lift[{0}]: Passenger[{1}] OUT", lift.ID, passenger.ID); lift.CurrentPeopleNum--; lift.CurrentLoad -= passenger.Weight; lift.RequestInPassengers.Remove(passenger); lift.OutTargets.Remove(lift.CurrentFloor); passengers.Remove(passenger); i--; } } if (!lift.InTargets.Any() && !lift.OutTargets.Any()) { lift.Direction = LiftDirectionEnum.None; lift.Status = LiftStatusEnum.Paused; } //模拟乘客进出电梯的时间 Thread.Sleep(Constants.OutInInMS); if (lift.Status == LiftStatusEnum.OUT_IN) { Console.WriteLine("Lift[{0}] is leaving {1}", lift.ID, lift.CurrentFloor); lift.Status = LiftStatusEnum.Running; } } if (lift.Status == LiftStatusEnum.Running) { if (lift.Direction == LiftDirectionEnum.None) { lift.Direction = LiftDirectionEnum.Up; } //模拟上行或下行一层的时间 Thread.Sleep(Constants.OneFloorTimeInMS); if (lift.Direction == LiftDirectionEnum.Up) { lift.CurrentFloor++; if (lift.CurrentFloor == lift.Building.MaxFloor) { lift.Direction = LiftDirectionEnum.Down; } } else if (lift.Direction == LiftDirectionEnum.Down) { lift.CurrentFloor--; if (lift.CurrentFloor == lift.Building.MinFloor) { lift.Direction = LiftDirectionEnum.Up; } } } else { //暂停中 Thread.Sleep(Constants.PausedLoopInMS); } } }