示例#1
0
        private void PutIdleUsersAtCashiers()
        {
            var availableUsers = users.Where(u => u.Cashier == null).ToList();

            if (availableUsers.Count == 0)
            {
                return;
            }

            // Any idle users, and any free cashier stations, and any non-served tickets?
            var availableCashiers   = cashiers.Where(c => c.CurrentUser == null).ToList();
            var servableSeviceTypes = serviceTypes.Where(st => st.Queue.HasTickets).ToList();

            bool validOperation = (availableUsers.Count > 0) && (availableCashiers.Count > 0) && (servableSeviceTypes.Count > 0);

            if (!validOperation)
            {
                // This office is working at max capacity, or there are no waiting customers
                return;
            }

            float cashierOpenProbability = this.UserCashierOpeningsPerTick;

            TestRandom(cashierOpenProbability, () =>
            {
                DummyUser idleUser           = GetRandom(availableUsers);
                DummyCashier freeCashier     = GetRandom(availableCashiers);
                DummyServiceType serviceType = GetRandom(servableSeviceTypes);

                Log("{0} manning {1}, dealing with {2}", idleUser, freeCashier, serviceType);
                freeCashier.Open(idleUser, serviceType);
            });
        }
示例#2
0
 public void Open(DummyUser user, DummyServiceType serviceType)
 {
     if (CurrentUser != null) throw new InvalidOperationException("Cashier already occupied");
     CurrentUser = user;
     ServiceType = serviceType;
     user.Cashier = this;
 }
示例#3
0
 public void Open(DummyUser user, DummyServiceType serviceType)
 {
     if (CurrentUser != null)
     {
         throw new InvalidOperationException("Cashier already occupied");
     }
     CurrentUser  = user;
     ServiceType  = serviceType;
     user.Cashier = this;
 }