Exemple #1
0
        public void Work()
        {
            while (_handledClientsCount < _clientsPerDay)
            {
                bool possibleToCutClient = false;
                lock (_stateMonitor)
                {
                    if (_state == BarberState.Sleeping)
                    {
                        continue;
                    }

                    possibleToCutClient = IfPossibleToCutClient();

                    if (!possibleToCutClient && _state == BarberState.Waiting)
                    {
                        _state = BarberState.Sleeping;
                        Console.WriteLine("Barber went to sleep");
                    }
                }

                if (possibleToCutClient)
                {
                    CutClient();
                }
            }
        }
Exemple #2
0
 public Barber(Shop shop, EventHandler shopEvents, double speed = 3.0)
 {
     Id              = idCount++;
     state           = BarberState.Waiting;
     CutSpeed        = speed;
     this.shopEvents = shopEvents;
     shopEvents.Subscribe <Shop.FinishedTreating>(FinishedTreating);
 }
Exemple #3
0
 private void TreatCustomer(Customer customer)
 {
     if (customer != null)
     {
         currentCustomer = customer;
         state           = BarberState.Cutting;
         var thread = new Thread(CutHair);
         thread.Start();
     }
 }
Exemple #4
0
        public async Task WalkToRoom()
        {
            BarberState = BarberState.Walking;

            await Task.Delay(_walkingTimeRange.GetDelay());

            if (InvititationBroadcasted != null)
            {
                InvititationBroadcasted.Invoke(this, new InvititationBroadcastedEventArgs("Barber is inviting a customer"));
            }
        }
Exemple #5
0
        public async Task Sleep()
        {
            BarberState = BarberState.Walking;

            await Task.Delay(_walkingTimeRange.GetDelay());

            BarberState = BarberState.Sleeping;

            if (FellAsleep != null)
            {
                FellAsleep.Invoke(this, new FellAsleepEventArgs("Barber is sleeping... Zzz.."));
            }
        }
Exemple #6
0
        public bool WakeUp()
        {
            lock (_stateMonitor)
            {
                if (_state != BarberState.Sleeping)
                {
                    return(false);
                }

                Console.WriteLine("Woke up barber");
                _state = BarberState.Waiting;
                return(true);
            }
        }
Exemple #7
0
        public async Task PerformBarbering(Customer customer)
        {
            BarberState = BarberState.Barbering;

            await Task.Delay(_barberingTimeRange.GetDelay());

            if (BarberingFinished != null)
            {
                BarberingFinished.Invoke(this,
                                         new BarberingFinishedEventArgs("Barber has finished with " + customer));
            }

            await WalkToRoom();
        }
Exemple #8
0
        private void CutHair()
        {
            do
            {
                Thread.Sleep(1000);
            } while (currentCustomer.CutHair(CutSpeed));
            var customer = currentCustomer;

            state = BarberState.Resting;
            shopEvents.Trigger <Shop.FinishedCutting>(customer);
            currentCustomer = null;
            Thread.Sleep(new Random(DateTime.Now.Millisecond).Next(1000, 5000));
            state = BarberState.Waiting;
            shopEvents.Trigger <Shop.BarberVacancy>(this);
        }
Exemple #9
0
        private void CutClient()
        {
            _queue.TryDequeue(out var client);

            lock (_stateMonitor)
            {
                _state = BarberState.Cutting;
            }
            Console.WriteLine("Starting cutting client: {0}", _handledClientsCount + 1);

            Thread.Sleep(client.CutTime);

            Console.WriteLine("Cutting done");

            lock (_stateMonitor)
            {
                _state = BarberState.Waiting;
            }

            _handledClientsCount++;
        }