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