Long Polling C#

669
04 января 2017, 00:58

Добрый день. Подскажите, пожалуйста, каким образом можно реализовать лонг пуллинг к серверам вконтакте на C# ? Сейчас использую рекурсивный вызов асинхронного метода, но это создает определенные баги в приложении

private async Task GetUpdatesFromServer()
{
await Task.Run(async () =>
{
    string url = $"какой-то урл";
    using (var http = new HttpClient())
    {
        var json = await http.GetStringAsync(url);
        var updates = JsonConvert.DeserializeObject<LongPollUpdates>(json);
        Ts = updates.Ts;
        if (updates.Updates.Count > 0)
        {
            await SendUpdate.Invoke(updates.Updates);
        }
    }
    await GetUpdatesFromServer();
});
}
Answer 1

Вот кусок из когда-то мной написанного кода:

    public async Task GetMessagesAsync()
    {
        lock(_login)
            if (_cts != null) return;
        _cts = new CancellationTokenSource();
        LongPollServerResponse longPollingServer = null;
        try
        {
            longPollingServer = _myAcc.Messages.GetLongPollServer(true);
        }
        catch (NeedValidationException ex)
        {
            try
            {
                await RegistrationExplicityAsync(ex.redirectUri.ToString()).ConfigureAwait(false);
                longPollingServer = _myAcc.Messages.GetLongPollServer(true);
            }
            catch (Exception)
            {
                return;
            }
        }
        CancellationToken ct = _cts.Token;
        string ts;
        while (true)
        {
            try
            {
                var answer = await longPolling.GetStringAsync($"https://{longPollingServer.Server}?act=a_check&key={longPollingServer.Key}&ts={longPollingServer.Ts}&wait=100&version=1").ConfigureAwait(false);
                if (ct.IsCancellationRequested) return;
                JObject jAnswer = JObject.Parse(answer);
                try
                {
                    ThrowIfFailed(jAnswer);
                }
                catch (VkLongPollingException ex)
                {
                    if (ex.Error == 1)
                    {
                        ts = jAnswer.SelectToken("$.ts").ToString();
                        longPollingServer.Ts = ulong.Parse(ts);
                    }
                    else if (ex.Error == 2 || ex.Error == 3)
                        longPollingServer = _myAcc.Messages.GetLongPollServer(true);
                    else if (ex.Error == 4)
                    {
                        return;
                    }
                    continue;
                }
                ts = jAnswer.SelectToken("$.ts").ToString();
                longPollingServer.Ts = ulong.Parse(ts);
                MessageHandler(jAnswer);
            }
            catch (Exception ex)
            {
                await Task.Delay(10 * 1000).ConfigureAwait(false);
            }
        }
    }
READ ALSO
Как прибиндить List в MVVM

Как прибиндить List в MVVM

Есть модель пользователя, в которой находится список сообщений этого пользователя

480
c# Оптимальный выбор Micro-ORM [требует правки]

c# Оптимальный выбор Micro-ORM [требует правки]

Мне уже где-то и когда-то давали ответ на даный вопрос и, что довольно странно, я обыскался его и так и не нашел =(

535
Вернуть тип объекта

Вернуть тип объекта

Как в переменную, записать тип объекта и потом её использовать? Например, есть тип VkNetEnums

452
Команды для элементов в ItemsControl

Команды для элементов в ItemsControl

В программе используется несколько ItemsControl с переопределенным стилем, элементы которых кнопки, которые делают примерно одно и то же: по клику...

486