При цикловом отправлении запросов httpclient начинает тупить

У меня программа, отправляет запрос, и парсит ответ. Таких запросов у меня 1000. После 10-15 запросов, Httpclient начинает тупить, и отправляет запрос где-то секунд 10, и далее медленнее и медленнее. Примерный код:

class a5
{
    public static HttpClient client = new HttpClient();

    public async System.Threading.Tasks.Task main()
    {
        for (int page = 0; Position < 1000; page++)
        {
            //int totalpages = await frist1(link);
            string full_json = await post_all_pages(page, link);
            var jsons = JsonConvert.DeserializeObject<Json5>(full_json);
            // Далее парсинг данных...
        }
    }
    // запрос 
    private async System.Threading.Tasks.Task<string> post_all_pages(int page, string link)
    {
        var Other_Link = link.Substring(link.LastIndexOf("/") + 1, link.Length - (link.LastIndexOf("/") + 1));

        var jsonrequest = "{\"PageSize\":" + 25 + ",\"PageNumber\":" + page + ",\"OrderBy\":\"PriceAsc\",\"HotelId\":null}";
        var content = new StringContent(jsonrequest, Encoding.UTF8, "application/json");
        var html = await client.PostAsync("https://intourist.ru/search/api/TourSearch/" + Other_Link, content);
        Console.WriteLine("{\"PageSize\":" + 25 + ",\"PageNumber\":" + page + ",\"OrderBy\":\"PriceAsc\",\"HotelId\":null}");
        Console.WriteLine(html);
        return html.Content.ReadAsStringAsync().Result;
    }

Проблема не в библиотеке JsonConverter, а в Httpclient, т.к если делать запросы на html страницу, и её парсить, то проблема остается та же


Ответы (1 шт):

Автор решения: aepot

Вы игнорируете IDisposable у классов.

Вот, исправил код метода.

public async Task main()
{
    List<Task<Json5>> tasks = new List<Task<Json5>>();
    int maxConcurrentTasks = Environment.ProcessorCount * 2;
    using (SemaphoreSlim semaphore = new SemaphoreSlim(maxConcurrentTasks))
    {
        for (int page = 0; page < 1000; page++)
        {
            await semaphore.WaitAsync();
            tasks.Add(post_all_pages<Json5>(page, link, semaphore));
        }

        try
        {
            Json5[] jsons = await Task.WhenAll(tasks);
            foreach (Json5 json in jsons)
            {
                // здесь обрабатываете полученные данные
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

private async Task<T> post_all_pages<T>(int page, string link, SemaphoreSlim semaphore)
{
    try
    {
        string Other_Link = link.Substring(link.LastIndexOf("/") + 1, link.Length - (link.LastIndexOf("/") + 1));

        string jsonrequest = "{\"PageSize\":" + 25 + ",\"PageNumber\":" + page + ",\"OrderBy\":\"PriceAsc\",\"HotelId\":null}";
        using (var content = new StringContent(jsonrequest, Encoding.UTF8, "application/json"))
        using (var response = await client.PostAsync("https://intourist.ru/search/api/TourSearch/" + Other_Link, content))
        {
            string text = await response.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<T>(text);
        }
    }
    finally
    {
        semaphore.Release();
    }
}
→ Ссылка