При цикловом отправлении запросов 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();
}
}