/// <summary>
        /// Обработка запросов зарегистрированных пчёл.
        /// </summary>
        /// <param name="sender">Пчела-отправитель запроса.</param>
        /// <param name="request">Запрос пчелы к улью.</param>
        private void BeeOnRequestBeehiveData(
            object sender,
            BeeRequest request)
        {
            switch (request.RequestType)
            {
            case BeeRequestType.RequestToEnterBeehive:
                request.Succeed  = this.acceptedList.IsBeeAcceptedToEnter((IBee)sender);
                request.Response = request.Succeed;
                break;

            case BeeRequestType.RequestGuardPostQueue:
                request.Succeed = ((IBee)sender).Type == BeeType.Guard &&
                                  ((IBee)sender).BeehiveNumber == this.state.BeehiveNumber;

                if (request.Succeed)
                {
                    request.Response = this.guardPostQueue;
                }

                break;

            default:
                throw new ArgumentOutOfRangeException(
                          $"Неизвестный тип запроса пчелы - {request.RequestType}",
                          nameof(request));
            }
        }
Beispiel #2
0
        /// <summary>
        /// Запросить у улья очередь поста охраны и начать работу.
        /// </summary>
        private void RequestGuardPostQueue()
        {
            var request = new BeeRequest <GuardPostQueue>
            {
                RequestType = BeeRequestType.RequestGuardPostQueue
            };

            this.SafeSendRequest(request);

            if (!request.Succeed ||
                request.TypedResponse == null)
            {
                if (!this.isWorking)
                {
                    return;
                }

                throw new InvalidOperationException(
                          "Не удалось получить очередь поста охраны пчёл.");
            }

            this.guardPostQueue = request.TypedResponse;

            this.CheckOneBee();
        }
        /// <summary>
        /// Запросить вход в улей на посте охраны.
        /// </summary>
        private async void RequestToEnterBeehive()
        {
            if (!this.isWorking)
            {
                return;
            }

            BeeRequest request = new BeeRequest
            {
                RequestType = BeeRequestType.RequestToEnterBeehive
            };

            this.SafeSendRequest(request);

            // startnew вместо обычного вызова - для
            // предотвращения возможного зацикливания
            if (request.Succeed)
            {
                await Task.Factory.StartNew(this.GoToRest);
            }
            else
            {
                await Task.Delay(this.balance.GuardBalance.TimeToCheckOneBee);

                await Task.Factory.StartNew(this.RequestToEnterBeehive);
            }
        }
        /// <summary>
        /// Отправить запрос улью, если работа еще не остановлена.
        /// </summary>
        /// <param name="args">Запрос.</param>
        protected void SafeSendRequest(BeeRequest args)
        {
            if (!this.isWorking)
            {
                return;
            }

            this.requestForBeehiveDataInternal(this, args);
        }