HttpClient занимает слишком много времениC#

Место общения программистов C#
Ответить
Anonymous
 HttpClient занимает слишком много времени

Сообщение 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();
}


Подробнее здесь: https://stackoverflow.com/questions/753 ... g-too-long
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»