Ошибка HttpClient.GetAsync после некоторого времени работы с TaskCanceledException. Задача была отменена

Я использую метод GetAsync для получения ответа от сервера. Следующий код работает нормально для первых двух итераций, а затем выдает ошибку с сообщением «Задача была отменена». Я искал в Интернете, но не нашел обходного пути. Была рекомендация использовать async/await из-за взаимоблокировки, но я не думаю, что здесь проблема, и это тоже не сработало.

Любые идеи, что вызывает исключения и как это предотвратить?

Изменить: я уже рассмотрел этот вопрос и попытался использовать async/await, как уже упоминалось, и изменил время ожидания по умолчанию на 5 минут вместо 100 секунд. Ни один из них не работал. Я предполагаю, что это что-то еще, поскольку из журнала Netstat я вижу, что порт находится в состоянии TIME_WAITING.

HttpClient — задача была отменена?

Примечание. Я использую System.Net.Http версии 4.3.4 и .NET 4.6.1.

using System;
using System.Net.Http;

namespace Main
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new HttpClient();
            string url = "https://www.google.com";
            for (int i = 0; i < 10; i++)
            {
                var response = client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead).GetAwaiter().GetResult();
                Console.WriteLine(response.StatusCode);
            }

            Console.ReadKey();
        }


    } 
}

person Divyansh Chowdhary    schedule 29.05.2020    source источник
comment
Этот код отлично работает на моей машине и возвращает OK для всех десяти ответов. На вашем месте я бы попробовал другой веб-сервер или другой IP-адрес и посмотрел, даст ли это какие-либо другие результаты.   -  person CyanCoding    schedule 29.05.2020
comment
Также взгляните на HttpClient — задача была отменена?.   -  person CyanCoding    schedule 29.05.2020
comment
@CyanCoding, вы запускали код с HttpClient v4.3.4. Потому что я пробовал и с другим сервером, но каждый раз получаю один и тот же ответ (т.е. только 2 успешных вызова из 10). Журнал netstat показал мне, что порт находится в состоянии Time_waiting.   -  person Divyansh Chowdhary    schedule 29.05.2020
comment
Я уже прошел по этой ссылке, но это не дало мне правильного объяснения об исключении, которое я получаю. Потому что я не думаю, что чтение ответа с сервера Google займет более 100 секунд. Кроме того, я попытался увеличить время ожидания до 5 минут, но это тоже не помогло.   -  person Divyansh Chowdhary    schedule 29.05.2020
comment
Сделайте Main() async и await [HttpClient].GetAsync(...). Используйте static HttpClient.   -  person Jimi    schedule 29.05.2020
comment
@Jimi, как уже упоминалось, я уже пытался сделать main асинхронным и использовать ожидание при выполнении запроса. Статический Httpclient здесь не имеет значения, так как я инициализирую клиент только один раз в Main.   -  person Divyansh Chowdhary    schedule 29.05.2020
comment
Я не вижу кода, соответствующего вашему описанию. HttpClient предназначен для использования таким образом, поэтому используйте его таким образом.   -  person Jimi    schedule 29.05.2020
comment
@Jimi код с async/await, вот код, который я пробовал с async/await со статическим клиентом, и выдавал ту же ошибку.   -  person Divyansh Chowdhary    schedule 29.05.2020
comment
Вы можете сделать это в любом случае, это будет работать в любом случае. Способ aysnc предпочтительнее. Обязателен в некоторых контекстах. Вы должны отметить, что response одноразовый, поэтому напишите что-то вроде: using (var response = client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead).GetAwaiter().GetResult()) { Console.WriteLine(response.StatusCode); }. Используйте статический HttpClient.   -  person Jimi    schedule 29.05.2020
comment
@Джими, спасибо. Создание ответа как одноразового работает нормально. Не могли бы вы дать мне объяснение того, почему он работает при использовании внутри блока using, а не при создании нового ответа каждый раз, как это описано в приведенном выше коде. Я не могу понять разницу ч / б два. Я понимаю, что при объявлении его в блоке использования он будет автоматически помечен для удаления сборщиком мусора после его выполнения. Но почему это приводит к ошибке «Задача была отменена», если она не используется внутри используемого блока.   -  person Divyansh Chowdhary    schedule 29.05.2020
comment
Извините, но объяснять в комментариях, как ServicePointManager обрабатывает ServicePoints и пул подключений, в сочетании с блокировкой асинхронных вызовов, функциональностью HttpClient и одноразовыми объектами, слишком много. Кстати, GC здесь не при чем, он тут ничего не успевает.   -  person Jimi    schedule 29.05.2020
comment
Без проблем. Спасибо за помощь @Jimi   -  person Divyansh Chowdhary    schedule 29.05.2020