Добрый день. Подскажите, пожалуйста, каким образом можно реализовать лонг пуллинг к серверам вконтакте на 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();
});
}
Вот кусок из когда-то мной написанного кода:
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);
}
}
}
Есть модель пользователя, в которой находится список сообщений этого пользователя
Мне уже где-то и когда-то давали ответ на даный вопрос и, что довольно странно, я обыскался его и так и не нашел =(
Как в переменную, записать тип объекта и потом её использовать? Например, есть тип VkNetEnums
В программе используется несколько ItemsControl с переопределенным стилем, элементы которых кнопки, которые делают примерно одно и то же: по клику...