/// <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();
        }