HttpClient становится медленнее, когда задано свойство Timeout - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь реализовать что-то, что будет действовать как команда Ping CMD в том смысле, что она отправит запрос серверу, ожидает в течение определенного периода времени, и они объявляют пакет этого запроса как потерянный, запрос был завершается за разумное время до того, как я установил свойство Timeout объекта HttpClient, но после выполнения запроса время истекло (до установки свойства Timeout используется около 1000 мс для получения данных с сервера). Кто-нибудь имел бы представление о том, почему это происходит?

public class TestPacketLoss
{
    private HttpClient _client;

    public TestPacketLoss()
    {
        _client = new HttpClient();
        _client.BaseAddress = new Uri("https://localhost:5001/api/");
        _client.Timeout = new TimeSpan(0, 0, 0, 0, 1500);
    }

    public async Task Start()
    {
        Stopwatch sw = new Stopwatch();
        long milliseconds = 0;
        int packetsLost = 0;
        for (int i = 0; i < 60; i++)
        {
            sw.Restart();

            HttpResponseMessage response;
            try
            {
                response = await _client.GetAsync("Temprature/");
                if (response.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    Console.WriteLine($"Request received in {sw.ElapsedMilliseconds} ms");

                    milliseconds += sw.ElapsedMilliseconds;
                }
                else
                {
                    packetsLost++;
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine($"Failed in {sw.ElapsedMilliseconds}");
                packetsLost++;
            }


        }

        Console.WriteLine($"Received 60 messages in avarage of {milliseconds / 60} ms");
        Console.WriteLine($"Number of packets lost {packetsLost}");
    }
}

Обновление

быстрое обновление с использованием отладчика. Я на самом деле обнаружил, что время между запросом и ошибкой меньше времени ожидания, что говорит о том, что что-то не так с тем, как HttpClient вычисляет время ожидания

...