在循环中发送请求时,httpclient 开始变慢
When sending requests in a loop, httpclient starts to be slowing
我有一个发送请求并解析响应的程序。我想做 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;
}
List<Task<string>> alltasks = new List<Task<string>>();
for (int page = 0; Position < 1000; page++)
{
//int totalpages = await frist1(link);
Task<String> t = post_all_pages(page, link);
alltasks.add(t);
//var jsons = JsonConvert.DeserializeObject<Json5>(full_json);
// Далее парсинг данных...
}
Tasks.WaitAll(alltasks.ToArray());
您可能想要创建一个异步函数来调用 post_all_pages
,然后等待结果,然后执行 JsonDeserialize
。
[编辑 2020 年 7 月 18 日]
使用 WhenAll 是更好的解决方案:
await Task.WhenAll(alltasks.ToArray());
我有一个发送请求并解析响应的程序。我想做 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;
}
List<Task<string>> alltasks = new List<Task<string>>();
for (int page = 0; Position < 1000; page++)
{
//int totalpages = await frist1(link);
Task<String> t = post_all_pages(page, link);
alltasks.add(t);
//var jsons = JsonConvert.DeserializeObject<Json5>(full_json);
// Далее парсинг данных...
}
Tasks.WaitAll(alltasks.ToArray());
您可能想要创建一个异步函数来调用 post_all_pages
,然后等待结果,然后执行 JsonDeserialize
。
[编辑 2020 年 7 月 18 日] 使用 WhenAll 是更好的解决方案:
await Task.WhenAll(alltasks.ToArray());