Тайм-аут параллельных запросов HttpClient с использованием Task.WhenAll по истечении одного запроса - PullRequest
1 голос
/ 09 июля 2019

Я делаю ~ 20 запросов http, используя один httpclient, этот httpclient долгое время жизни, что означает, что он не упакован в оператор использования. Поскольку веб-сервис обычно довольно быстрый (время отклика ~ 200 мс), я установил тайм-аут на 5 с.

Теперь я столкнулся с проблемой: если один запрос заканчивается в это время, все другие запросы отменяются. Это нормальное поведение?

Вот код, который я использую для одновременных звонков

public async Task GetAll()
{
    await Task.WhenAll(x => x.Select(xx => GetData(xx.Id));
}

Код для вызова API:

    public async Task GetData(int id)
    {
        string payload = "";
        try
        {
            var resp = await base.GetAsync($"/apis/v2/getdata/{id}");
            if (!resp.IsSuccessStatusCode)
                Console.WriteLine("Error");

            payload = await resp.Content.ReadAsStringAsync();
            Console.WriteLine(payload);
        }
        catch (System.Exception ex)
        {
            Console.WriteLine("Error");
        }
    }

Мой базовый класс HttpClient

public class MyHttpClient : System.Net.Http.HttpClient
{
    public Logger Log  { get; set; }
}

Если я запускаю задачу в последовательном порядке, все работает нормально, но когда я запускаю их параллельно и одна задача запускается по таймауту, все остальные не завершенные задачи будут отменены.

1 Ответ

1 голос
/ 09 июля 2019

Если какая-либо из предоставленных задач завершается в состоянии Failed, возвращаемая задача также завершается в состоянии Failed, где ее исключения будут содержать агрегацию набора развернутых исключений из каждой из предоставленных задач.

Источник: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.whenall?view=netframework-4.8

...