/// <summary>
        /// Выполнить запрос к LongPoll серверу ВКонтакте
        /// </summary>
        /// <param name="data">Данные для подключения.</param>
        private async Task <VKLongPollResponse> GetResponse(VKLongPollServerData data)
        {
            using (var client = new HttpClient())
            {
                byte currentRetry = 0;
                while (currentRetry < MAX_RETRIES_NUMBER)
                {
                    HttpResponseMessage response = null;
                    try
                    {
                        response = await client.GetAsync(new Uri(String.Format(
                                                                     LONGPOLL_CONNECTION_MASK, data.Server, data.Key, data.Ts,
                                                                     LONGPOLL_WAIT, LONGPOLL_MODE))).AsTask(cts.Token);
                    }
                    catch (OperationCanceledException) { throw; }
                    catch (Exception)
                    {
                        if (++currentRetry < MAX_RETRIES_NUMBER)
                        {
                            int timeout = currentRetry * 5;
                            SendConnectionErrorPush(timeout);
                            await Task.Delay(timeout * 1000, cts.Token);

                            continue;
                        }
                    }

                    string json = await response.Content.ReadAsStringAsync().AsTask(cts.Token);

                    return(JsonConvert.DeserializeObject <VKLongPollResponse>(json));
                }
            }

            throw new Exception("Exit from GetResponse loop");
        }
        /// <summary>
        /// Попытаться загрузить данные для подключения к LongPoll-Сервису ВКонтакте.
        /// Возвращает успешность операции.
        /// </summary>
        private async Task <bool> GetServerData(bool trace = false)
        {
#if DEBUG
            Debug.WriteLine("Getting LongPoll Server Data...");
#endif
            if (trace)
            {
                CoreHelper.SendInAppPush(
                    "Получение данных для подключения к серверу...",
                    "Выполняется подключение", PopupMessageType.Info);
            }

            var response = await(new GetLongPollServerRequest {
                NeedPts = VKBoolean.True
            }).ExecuteAsync(_cts.Token);

            if (response.Error.ErrorType == VKErrors.None)
            {
                _serverData = response.Response;
                return(true);
            }
            else
            {
                if (_numberOfRetries == 5)
                {
#if DEBUG
                    Debug.WriteLine("Getting of LongPoll server data failed. Stopping the service...");
#endif
                    if (trace)
                    {
                        CoreHelper.SendInAppPush(
                            "Не удалось получить данные для подключения к серверу",
                            "Сервис мгновенных сообщений", PopupMessageType.Error);
                    }

                    Stop(LongPollStopReason.CantGetServerData);
                    return(false);
                }
                _numberOfRetries++;
#if DEBUG
                Debug.WriteLine(String.Format("LongPoll connecton error. Attempt number: {0}. Attempt after {1} seconds.",
                                              _numberOfRetries, 5 * _numberOfRetries));
#endif
                if (trace)
                {
                    CoreHelper.SendInAppPush(
                        "Повтор через " + 5 * _numberOfRetries + " секунд",
                        "Ошибка соединения", PopupMessageType.Warning);
                }

                await Task.Delay(TimeSpan.FromSeconds(5 * _numberOfRetries));

                return(await GetServerData(trace));
            }
        }
        /// <summary>
        /// Останавливает сервис работы с LongPoll-Сервисом ВКонтакте.
        /// </summary>
        /// <param name="reason">Причина остановки сервиса.</param>
        private void Stop(LongPollStopReason reason)
        {
            if (!IsWorking)
            {
                return;
            }
            IsWorking        = false;
            _numberOfRetries = 0;
            _timer.Stop();
            _timer.Tick -= Timer_Tick;

            if (_cts != null)
            {
                _cts.Cancel(true);
            }
            _serverData = null;

            OnServiceStopped(reason);
        }