Я создал консольное приложение .Net Framework 4.7.2, которое одновременно выполняет множество запросов к API, размещенному в AWS. Моя проблема в том, что запросы выполняются слишком долго.
Время ответа API обычно составляет 100–400 мс в соответствии с мониторингом группы тегов в консоли AWS, но в моем приложении время, прошедшее для каждого запроса начинается с 1 секунды и продолжает увеличиваться до 11 секунд.
Я уже знаю, что HttpClient не закрывает соединения должным образом, поэтому нам не следует использовать using, а вместо этого всегда использовать один экземпляр для каждое приложение.
Я уже нашел подобный вопрос, но ответ не решил его.
Когда я установил MaxDegreeOfParallelism на 1, время ответа в приложении аналогично app. Кажется, это проблема, которая возникает в HttpClient в многопоточном режиме.
Вот как я выполняю запросы:
public static class RequestMaker
{
private static readonly string _urlHttp = "http://apidomain.com/api/apiname";
private static readonly HttpClient _httpClient = new HttpClient();
public static async Task PostAsync(string postData)
{
bool IsSuccessStatusCode = false;
int maxRetries = 5;
int count = 0;
do
{
try
{
Stopwatch watcher = Stopwatch.StartNew();
using (HttpContent content = new StringContent(postData, Encoding.UTF8, "application/json"))
using (HttpResponseMessage result = await _httpClient.PostAsync(_urlHttp, content).ConfigureAwait(false))
{
watcher.Stop();
Console.WriteLine("Elapsed = " + watcher.ElapsedMilliseconds.ToString("N0"));
IsSuccessStatusCode = result.IsSuccessStatusCode;
if (IsSuccessStatusCode)
return await result.Content.ReadAsStringAsync().ConfigureAwait(false);
count++;
if (count > maxRetries)
return "";
Console.WriteLine($"Retrying request because of request status code {result.StatusCode}");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
count++;
if (count > maxRetries)
return "";
}
} while (!IsSuccessStatusCode);
return "";
}
}
Это моя функция, одновременно вызывающая запрос:
static void RunBatchMany(List list)
{
var getCustomerBlock = new TransformBlock(
async lstRec =>
{
ApiInputObject apiInput = new ApiInputObject();
// PrepareInputObject
string postData = JsonConvert.SerializeObject(apiInput);
Stopwatch watcher = Stopwatch.StartNew();
string json = await RequestMaker.PostAsync(postData);
ApiResponseObject res = JsonConvert.DeserializeObject(json);
watcher.Stop();
return watcher.ElapsedMilliseconds;
}, new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 8
});
foreach (var id in list)
getCustomerBlock.Post(id);
getCustomerBlock.Complete();
getCustomerBlock.Completion.Wait();
}
Подробнее здесь: https://stackoverflow.com/questions/753 ... g-too-long
HttpClient занимает слишком много времени ⇐ C#
Место общения программистов C#
1733222359
Anonymous
Я создал консольное приложение .Net Framework 4.7.2, которое одновременно выполняет множество запросов к API, размещенному в AWS. Моя проблема в том, что запросы выполняются слишком долго.
Время ответа API обычно составляет 100–400 мс в соответствии с мониторингом группы тегов в консоли AWS, но в моем приложении время, прошедшее для каждого запроса начинается с 1 секунды и продолжает увеличиваться до 11 секунд.
Я уже знаю, что HttpClient не закрывает соединения должным образом, поэтому нам не следует использовать using, а вместо этого всегда использовать один экземпляр для каждое приложение.
Я уже нашел подобный вопрос, но ответ не решил его.
Когда я установил MaxDegreeOfParallelism на 1, время ответа в приложении аналогично app. Кажется, это проблема, которая возникает в HttpClient в многопоточном режиме.
Вот как я выполняю запросы:
public static class RequestMaker
{
private static readonly string _urlHttp = "http://apidomain.com/api/apiname";
private static readonly HttpClient _httpClient = new HttpClient();
public static async Task PostAsync(string postData)
{
bool IsSuccessStatusCode = false;
int maxRetries = 5;
int count = 0;
do
{
try
{
Stopwatch watcher = Stopwatch.StartNew();
using (HttpContent content = new StringContent(postData, Encoding.UTF8, "application/json"))
using (HttpResponseMessage result = await _httpClient.PostAsync(_urlHttp, content).ConfigureAwait(false))
{
watcher.Stop();
Console.WriteLine("Elapsed = " + watcher.ElapsedMilliseconds.ToString("N0"));
IsSuccessStatusCode = result.IsSuccessStatusCode;
if (IsSuccessStatusCode)
return await result.Content.ReadAsStringAsync().ConfigureAwait(false);
count++;
if (count > maxRetries)
return "";
Console.WriteLine($"Retrying request because of request status code {result.StatusCode}");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
count++;
if (count > maxRetries)
return "";
}
} while (!IsSuccessStatusCode);
return "";
}
}
Это моя функция, одновременно вызывающая запрос:
static void RunBatchMany(List list)
{
var getCustomerBlock = new TransformBlock(
async lstRec =>
{
ApiInputObject apiInput = new ApiInputObject();
// PrepareInputObject
string postData = JsonConvert.SerializeObject(apiInput);
Stopwatch watcher = Stopwatch.StartNew();
string json = await RequestMaker.PostAsync(postData);
ApiResponseObject res = JsonConvert.DeserializeObject(json);
watcher.Stop();
return watcher.ElapsedMilliseconds;
}, new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 8
});
foreach (var id in list)
getCustomerBlock.Post(id);
getCustomerBlock.Complete();
getCustomerBlock.Completion.Wait();
}
Подробнее здесь: [url]https://stackoverflow.com/questions/75337715/httpclient-taking-too-long[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия