Длинный опрос HttpClient прерван отдельным потоком - PullRequest
1 голос
/ 04 октября 2019

Я управляю ботом службы сообщений, который использует длинные опросы для отправки пользовательских сообщений. Это все работало нормально, пока я не добавил новый компонент, который отправляет простой запрос HTTP get в службу мониторинга сердцебиения каждые 30 секунд. После реализации этого компонента мой бот-код отправляет дополнительный запрос опроса в службу обмена сообщениями каждый раз, когда компонент heartbeat отправляет свой запрос.

Я предполагаю, что запрос, отправленный компонентом heartbeat, прерывает длительный опрос, или что-то в этом роде? Если я закомментирую запрос сердцебиения, все будет нормально.

Я пытался использовать общий HttpClient и отдельные HttpClients, которые утилизируются после любого использования.

Код монитора сердцебиения:

                using (var client = new HttpClient())
                {
                    var response = await client.GetAsync(_heartbeatUrl);

                    var responseString = await response.Content.ReadAsStringAsync();

                    if (!response.IsSuccessStatusCode)
                    {
                        Log.LogMessage(response.ReasonPhrase, LogType.Error);
                        Log.LogMessage(responseString, LogType.Error);
                    }
                    Log.LogMessage(responseString, LogType.Verbose);
                }

Код сообщения бот-опроса:

                using (var client = new HttpClient())
                {
                    client.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
                    var jsonData = JsonConvert.SerializeObject(data);

                    var content = new StringContent(jsonData, Encoding.UTF8, "application/json");

                    var fullString = _url + "/" + methodName;

                    Log.LogMessage("Quering: " + fullString, LogType.Verbose);
                    Log.LogMessage("With Data: " + jsonData, LogType.Verbose);

                    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, fullString)
                    {
                        Content = content,
                    };
                    request.Headers.Authorization = new AuthenticationHeaderValue("mybot", _botToken);

                    var response = await client.SendAsync(request);

                    var responseString = await response.Content.ReadAsStringAsync();
                    returnedObject = JsonConvert.DeserializeObject<T>(responseString);

                    if (!response.IsSuccessStatusCode)
                    {
                        Log.LogMessage(response.ReasonPhrase, LogType.Error);
                        Log.LogMessage(responseString, LogType.Error);
                    }

                    Log.LogMessage(responseString, LogType.Verbose);
                }

Оба они вызываются в простых циклах while (true), то есть

                Thread th = new Thread(async a =>
                {
                    while (true)
                    {
                        await SendHeartbeat();
                        Thread.Sleep(30000);
                    }
                });

и

            new Thread(async () =>
            {
                while (true)
                {
                    try
                    {
                        var results = await Methods.getUpdates(_service, update_id);

                    } catch (Exception e) { Log.LogMessage("Error with HTML query: " + e.Message, LogType.Error, e.StackTrace); }
                }
            }).Start();

Я немного озадачен тем, что может быть причиной этого. Любые предложения очень ценятся!

1 Ответ

0 голосов
/ 04 октября 2019

понял это в конце концов. Мои вызовы в мой статический класс Log имели блокировку для метода записи файла. Я считаю, что когда сердцебиение запускается и регистрирует свой результат, код опроса будет заблокирован при попытке записать материал, в результате чего поток будет освобожден асинхронным ожиданием. Новый поток начнет опрос до завершения предыдущего.

...