/// <summary> /// Один проход обработки. Диспетчер блокирует очередь от других /// потоков на время просмотра заявок. /// </summary> private void CheckRequests() { lock (_requests) { //Если очередь заявок пуста, дополнительные действия не требуются if (_requests.Count == 0) { return; } //Иначе достаём из очереди заявку и отправляем её на обработку в отделения var request = _requests.Dequeue(); if (_departments.HandleRequest(request)) { ContextProvider.GetInstance().Context.Send(obj => RequestProcessed?.Invoke(obj as Request), request); RequestCounter++; } else { //Если обработать не получилось (соответствующее заявке отделение занято), //заявка уходит обратно в очередь ContextProvider.GetInstance().Context.Send(obj => RequestPostponed?.Invoke(obj as Request), request); _requests.Enqueue(request); } } }
public HouseManagement() { _requests = new Queue <Request>(); _departments = CreateDepartments(); _departments.Subscribe((request, employee) => RequestFinished?.Invoke(request, employee)); _committee = new RequestCommittee(_requests); _committee.RequestAdded += request => RequestAdded?.Invoke(request); _dispatcher = new Dispatcher(_departments, _requests); _dispatcher.RequestProcessed += request => RequestProcessed?.Invoke(request); _dispatcher.RequestPostponed += request => RequestPostponed?.Invoke(request); _dispatcher.SimulationFinished += () => SimulationFinished?.Invoke(); }