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(); } } }
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); }
private void TreatCustomer(Customer customer) { if (customer != null) { currentCustomer = customer; state = BarberState.Cutting; var thread = new Thread(CutHair); thread.Start(); } }
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")); } }
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..")); } }
public bool WakeUp() { lock (_stateMonitor) { if (_state != BarberState.Sleeping) { return(false); } Console.WriteLine("Woke up barber"); _state = BarberState.Waiting; return(true); } }
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(); }
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); }
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++; }